我有一个使用 ant 和 eclipse 构建的项目,我希望它与 Java 8 兼容。
当我尝试使用 Java 8 运行 jar 时,出现以下错误:
$ /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar hypnos.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError:
org/joshuad/musicplayer/MusicPlayerUI 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
所以看起来它是使用 Oracle 的 Java 9(安装在我的系统上)编译的,但我在 eclipse 中找不到指定它的地方。我看到的一切似乎都表明我们正在使用 java 8(下面的屏幕截图)。
我觉得我一定错过了什么,但我不知道在哪里。 我需要做什么才能使这个 jar 与 Java 8/类文件版本 52.0 兼容?
Ant 构建文件
<project name="Hypnos Music Player" default="compile" basedir=".">
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="jarFile" location="hypnos.jar"/>
<path id="class.path">
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
<pathelement location="${jarFile}" />
</path>
<target name="init">
<tstamp/>
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init" description="compile the source">
<javac fork="yes" includeantruntime="false" srcdir="${src}" destdir="${build}">
<classpath refid="class.path" />
</javac>
</target>
<target name="jar" depends="compile" description="Create a jar.">
<jar destfile="${jarFile}" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="org.joshuad.musicplayer.MusicPlayerUI" />
<attribute name="Class-Path" value="lib/commons-cli-1.4.jar lib/jaad-0.8.4-nospi.jar
lib/jaudiotagger-2.2.6-SNAPSHOT.jar lib/jflac-1.2.jar
lib/jl1.0.1.jar lib/jogg-0.0.7.jar lib/jorbis-0.0.15.jar
lib/vorbisspi1.0.3.jar" />
</manifest>
</jar>
</target>
</project>
最佳答案
$JAVA_HOME
环境变量是什么?
我最近有一个 similar problem结果是 Ant似乎忽略了 Eclipse 提供的许多设置,只使用了 $JAVA_HOME
。我通过在 build.xml
中放置以下内容发现了这一点:
<target name="jdk_version_validation">
<echo message="Java Version: ${java.version}" />
<echo message="Java home: ${java.home}" />
<echo message="JAVA_HOME: ${env.JAVA_HOME}" />
<echo message="JAVACMD: ${env.JAVACMD}" />
</target>
这让我想到了:
jdk_version_validation:
[echo] Java Version: 1.7.0_80
[echo] Java home: C:\Program Files\Java\jre7
[echo] JAVA_HOME: C:\Program Files\Java\jdk1.8.0_131\
[echo] JAVACMD: C:\Program Files\Java\jdk1.7.0_80\bin
我发现预测 Ant 将生成哪个版本的唯一可靠方法是在 build.xml
中强制执行以下内容:
<property name="ant.build.javac.source" value="1.7"/>
<property name="ant.build.javac.target" value="1.7"/>
因此,我向您推荐:尝试在您的 build.xml
中放置以下内容:
<property name="ant.build.javac.source" value="1.8"/>
<property name="ant.build.javac.target" value="1.8"/>
更新,为了那些有 OP 中描述的问题变体的人的利益,以消除“Eclipse fooling Ant”的任何可能性:
- 转到
Window > Preferences > Java > Installed JREs
并尝试只保留目标 JRE,确保它是在 JDK 文件夹中的那个(而不是兄弟 JRE直接在Java
文件夹下)。 - 转到
Project > Properties > Java Compiler
并选中Enable project specific settings
,确保编译器合规级别设置为目标 JRE java 版本。
关于java - Eclipse/Ant 在 1.9 版本中制作一个 jar,即使一切似乎都为 1.8 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44233095/