2017-10-30 3 views
2

Ich habe meine Anwendung von Java 8 in Java 9 geändert. Die Windows-Systemumgebungsvariable (Pfad) und die JAVA_HOME in Java 9 (jdk-9.0.1) geändert.Das Ausführen von Java 9-Anwendung mit Andockfenster funktioniert nicht - UnsupportedClassVersionError

Beim Ausführen der Anwendung in der IDE (IntelliJ) es gut funktioniert. Es kompiliert auch ohne Probleme mit sbt. Das Ausführen der Anwendung mit Andockfenster funktioniert nicht.

Die Anwendung scheint mit Java 9 erfolgreich kompiliert zu werden, aber Docker versucht es mit Java 8 zu laufen (das ist, was ich von der Ausnahmemeldung lesen).

Befehle:

sbt docker:publish 

docker run --rm -p 9000:9000 eu.gcr.io/the-repository-name/the-image-name:1.0 

ich die folgende Fehlermeldung erhalten:

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
    Module has been compiled by a more recent version of the 
    Java Runtime (class file version 53.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(ClassLoader.java:763) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at play.api.inject.Modules$.locate(Module.scala:119) 
     at play.api.inject.guice.GuiceableModule$.loadModules(GuiceInjectorBuilder.scala:276) 
     at play.api.inject.guice.GuiceApplicationBuilder$.$anonfun$$lessinit$greater$default$9$1(GuiceApplicationBuilder.scala:30) 
     at play.api.inject.guice.GuiceApplicationBuilder.applicationModule(GuiceApplicationBuilder.scala:102) 
     at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:185) 
     at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137) 
     at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) 
     at play.core.server.ProdServerStart$.start(ProdServerStart.scala:51) 
     at play.core.server.ProdServerStart$.main(ProdServerStart.scala:25) 
     at play.core.server.ProdServerStart.main(ProdServerStart.scala) 

Was muss ich tun müssen, dass Docker verwendet Java 9?


java --version 
java 9.0.1 
Java(TM) SE Runtime Environment (build 9.0.1+11) 
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode) 

docker version 
Client: 
Version:  17.10.0-ce 
API version: 1.33 
Go version: go1.8.3 
Git commit: f4ffd25 
Built:  Tue Oct 17 19:00:02 2017 
OS/Arch:  windows/amd64 

Server: 
Version:  17.10.0-ce 
API version: 1.33 (minimum version 1.12) 
Go version: go1.8.3 
Git commit: f4ffd25 
Built:  Tue Oct 17 19:05:23 2017 
OS/Arch:  linux/amd64 
Experimental: true 
  • Play Version: 2.6.7
  • Scala Version 2.12.4
  • SBT Version: 1.0.2
  • sbt-native-Verpacker: 1.3.1
+2

vielleicht möchten Sie die Version der Bibliotheken nennen. Und das Hauptproblem hier ist eine Kernbibliothek, die stattdessen Java 9-Code als Java 8-Code kompiliert. Related [Kann Dateimodul-info.class in einem Java9-Projekt nicht verarbeiten, führt zu ClassFormatException] (https: // stackoverflow.com/questions/45802981/unfähig zu verarbeiten-Datei-Modul-info-Klasse-innerhalb-a-java9-Projekt-Ergebnisse-in-Klasse) – nullpointer

+0

@nullpointer Kannst du weiter erklären? Die Anwendung läuft in meiner IDE gut, sie kompiliert ohne Probleme mit Java 9 (nicht Java 8). Nur wenn ich es mit Docker veröffentlichen und ausführen, funktioniert es nicht. Der Fehler deutet darauf hin, dass das Projekt mit Java 9 kompiliert wird, aber Docker java 8. – Spen

+0

Ich würde raten, während Sie "veröffentlichen" und "ausführen", könnten Sie einige Core-Bibliothek transitively verwenden, die versuchen, auf die Klassendateien zuzugreifen als wären sie Java 8 Klassen, während sie stattdessen mit Java 9 kompiliert wurden. Für das weitere Debuggen möchten Sie vielleicht die vollständigen Protokolle angeben, detaillierte Schritte während des Veröffentlichens und ausführen, wie in der Frage erwähnt ... Wildste Vermutung ASM war eine Bibliothek, die für einige wenige solcher Instanzen verantwortlich war, die ich in verschiedenen Bibliotheken gesehen habe. – nullpointer

Antwort

1

der Fehler bedeutet, dass Sie versuchen, Code kompiliert laufen mit einer neueren Version von Java (9 mit der Klassenversion 53.0) in einer älteren Version von Java (8 mit der Klassenversion 52.0). In Ihrem Docker-Image ist wahrscheinlich Java 8 installiert. Lass uns eine Detektivarbeit machen. richtig :-)

Wenn ich verstehe, verwenden Sie sbt-native-Verpacker Ihr Docker Bild zu erzeugen. Wenn ja, wird unter Verwendung von SBT-native-Verpacker openjdk:latest Bild als das Basisbild, wie Sie hier sehen können:

https://github.com/sbt/sbt-native-packager/blob/v1.3.1/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala#L69

Version 1.3.1 die Version von Play 2.6.7, wie Sie auch verwendet wird, können siehe hier:

https://github.com/playframework/playframework/blob/2.6.7/framework/project/plugins.sbt#L8

Das Problem ist, dass openjdk:latest Bild verwendet Java 8. Sie können das bestätigen, indem man die latest Code linked at the image page. Hier ist der Code:

https://github.com/docker-library/openjdk/blob/a893fe3cd82757e7bccc0948c88bfee09bd916c3/8-jdk/Dockerfile#L38-L43

Da Sie dockerBaseImage verwenden, um ein Basis-Image ändern möchten, die verwendet Java 9, zum Beispiel:

dockerBaseImage := "9-jdk" 

Sie können eine vollständige Liste sehen von Bildversionen hier: https://hub.docker.com/_/openjdk/

+1

Das klingt wie, was ich dachte. Ich wusste nicht, wie ich die verwendete jdk-Version ändern sollte. Am Montag werde ich es versuchen. – Spen

Verwandte Themen