我在外部服务器上运行一个jar文件。 jar文件由mvn在我的本地机器上编译。外部服务器安装了java 1.7,所以我需要明确告诉maven编译到java 1.7,因为在我的本地机器上我已经使用了java 1.8。
但是,运行jar时仍然会出现以下错误:
Exception in thread "main" java.lang.UnsupportedClassVersionError: io/package/name/Launcher : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: io.package.name.Launcher. Program will exit.
根据其他线程Unsupported major.minor version 51.0
表示期望java 7( update :这是错误的。实际上错误意味着我尝试执行jar的系统无法处理提供的版本是51,等于java 7 / 1.7。这意味着系统运行的版本更低(java 1.6?))。但是,我仔细检查了编译的类,它们确实应该与java 7兼容。但是在检查时我可能做错了。我按照此处的说明使用HexEditor进行了检查:how to check the jdk version used to compile a .class file
这是一个显示Launcher.class的第7个和第8个字节的屏幕截图。 0x33
为51. 51表示类文件与Java 7兼容(根据https://stackoverflow.com/a/1096159/973158)。
服务器上的java -version
产生:
java version "1.7.0_79"
OpenJDK Runtime Environment (rhel-2.5.5.1.el6_6-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
这就是我告诉maven在pom.xml中编译为java 1.7的方法
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
我做错了什么?是不是服务器上有某种缓存,它仍然保存了编译为java 1.8的旧版本的类?
最终更新:
我的代码实际上是java 1.7兼容,但是,我不知道需要java 1.6的事实。我的坏。