Die mysteriöse java.exe war die Ursache für die Unfähigkeit, Java- und Java-Versionen immer wieder abzugleichen.

Umgebung

Erworben von: Mouse Computer Co., Ltd. Notebook / Desktop: Desktop-PC Betriebssystem: Windows 10 Home 64-Bit CPU: Intel (R) Core (TM) i5-7400-Prozessor (4 Kerne / 4 Threads / 3,00 GHz / TB bis 3,50 GHz / 6 MB Cache) Speicher: 16 GB (8 GB zum Zeitpunkt des Kaufs) Festplatte: 1 TB Festplatte (kompatibel mit 7200 U / min / 6 Gbit / s) SSD: Keine Grafik: Intel HD Graphics 630 Implementierungsdatum der folgenden Inhalte: 12. November 2019

Ausführungsfehler in Hello World

Ich beschloss, Java zu studieren, installierte Eclipse und JDK, um eine Umgebung zu erstellen, und übersetzte Eclipse ins Japanische. Ich wollte sofort "Hallo Welt" ausgeben, also habe ich fast den Code zum Kopieren und Einfügen in Hello.java gespeichert. > javac Hello.java Erfolgreich kompiliert. > java Hello Ich habe es ausgeführt, aber es ist ein Fehler aufgetreten.

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

Laut der Untersuchung tritt ein solcher Fehler auf, wenn die Versionen von "javac (JDK)" und "java (JRE)" unterschiedlich sind (insbesondere letzteres ist älter). Als ich die Version tatsächlich überprüfte,

> javac -version
javac 13.0.1

> java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) Client VM (build 25.231-b11, mixed mode)

Immerhin ist es anders. Ich dachte, dass die JRE, die ich ursprünglich eingegeben habe, älter war, deshalb habe ich sie von der offiziellen Website auf die neueste Version aktualisiert, aber die Versionsanzeige ändert sich nicht. Daher habe ich alle Java-bezogenen (JDK, JRE) aus "Systemsteuerung" -> "Programm deinstallieren" deinstalliert und alle Pfade aus "Einstellungen für Umgebungsvariablen" gelöscht. Danach habe ich das JDK neu installiert (es scheint, dass die JRE gleichzeitig enthalten sein wird) und den Pfad erneut übergeben, aber die Versionsanzeige ändert sich nicht.

Als ich beide deinstallierte und den Befehl zur Versionsprüfung mit nicht vollständig installiertem Java ausführte, wurde Folgendes angezeigt.

> javac -version
'javac'Ist ein interner oder externer Befehl,
Wird nicht als funktionsfähiges Programm oder Batchdatei erkannt.

> java -version
Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: Could not find Java SE Runtime Environment.

Der Befehl selbst scheint für javac ungültig zu sein, aber wird Java als Befehl erkannt und es tritt ein Fehler auf?

Entdecken Sie die mysteriöse java.exe

Zu diesem Zeitpunkt erinnerte ich mich daran, dass einige der gelöschten Java-bezogenen Pfade unbekannt waren (sicherlich "C: \ ProgramData \ Oracle \ Java"), und als ich diesen Ordner öffnete, qiita_java.png Es gab java.exe, die vollständig gelöscht werden sollte. Das Datum und die Uhrzeit der Aktualisierung sind das Datum, an dem der PC gekauft wurde. Ist es derjenige, der ursprünglich enthalten war? Ich habe mir die Liste "Programm deinstallieren" noch einmal genauer angesehen, konnte aber kein entsprechendes Programm finden. Ich habe den Namen des Ordners "Oracle" in "Oracle_nazonojava" geändert und den Befehl "Java-Versionsinformationen" erneut ausgeführt.

> java -version
'java'Ist ein interner oder externer Befehl,
Wird nicht als funktionsfähiges Programm oder Batchdatei erkannt.

Wie bei javac wird der Befehl selbst nicht mehr erkannt. Ich hätte den Pfad zum geänderten Ordner (sowohl aus der Benutzerumgebungsvariablen als auch aus der Systemumgebungsvariablen) löschen sollen, aber warum ändert sich das Befehlsergebnis, wenn der Ordnername geändert wird? In der Tat kann Path bestanden haben (Mangel an Studium).

Als ich das JDK in diesem Zustand neu installiert habe, stimmten die Versionen erfolgreich überein (Java wurde in dieselbe Version wie Javac geändert).

> javac -version
javac 13.0.1

> java -version
java version "13.0.1" 2019-10-15
Java(TM) SE Runtime Environment (build 13.0.1+9)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

"Hallo Welt" wurde ebenfalls erfolgreich kompiliert und ausgeführt.

Schließlich

Als ich gegoogelt habe, gab es Fälle, in denen die Versionen von Java und Javac unterschiedlich waren, aber alle wurden durch Neuinstallation gelöst, und ich konnte kaum etwas Ähnliches wie dieses Beispiel finden. (Der einzige Fall, in dem die Java-Version 1.8.0_231 bleibt, unabhängig davon, wie oft sie neu installiert wurde, was fast der gleichen Zeit entspricht, war der Google-Cache der Yahoo! Chiebukuro-Frage (gelöscht).) Es kann ein großes Problem sein, das von der Umgebung abhängt (PC-Käufer?), Aber es kann Menschen geben, die ähnliche Symptome haben, also werde ich es als Artikel schreiben.

Recommended Posts

Die mysteriöse java.exe war die Ursache für die Unfähigkeit, Java- und Java-Versionen immer wieder abzugleichen.
[CentOS8] Da der Befehl javac nicht verwendet werden konnte, installieren Sie die Java-Entwicklungsumgebung.
"Java.lang.NoClassDefFoundError: Klasse java.nio.file.FileSystems $ DefaultFileSystemHolder konnte nicht initialisiert werden" tritt auf, obwohl es kein Problem gibt, den Klassenpfad und die Codierung mehrmals zu überprüfen.
Warum Java die Zielsprache war, hasse ich