java - Eclipse/Ant 在 1.9 版本中制作一个 jar,即使一切似乎都为 1.8 设置

标签 java eclipse ant

我有一个使用 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 兼容?

项目 > 属性 > Java 构建路径 enter image description here

项目 > 属性 > Java 编译器 enter image description here

窗口 > 首选项 > 编译器 enter image description here

右键单击 Ant 构建文件 > 运行方式 > 外部工具配置 enter image description here

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”的任何可能性:

  1. 转到 Window > Preferences > Java > Installed JREs 并尝试只保留目标 JRE,确保它是在 JDK 文件夹中的那个(而不是兄弟 JRE直接在 Java 文件夹下)。
  2. 转到 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/

相关文章:

java if语句没有破坏 "for loop"

java - 如何打印正确格式化的字符串

Ant (1.6.5) - 如何在一个 <condition> 或 <if> 中设置两个属性

java - 我的 ant 任务可以等待 JBoss 部署吗

java - 如何更改 Jena 中 TriplePath 的节点?

java - 从 dotnet web 应用程序启动 JNLP

c++ - 使用 Caffe 运行简单的 C++ 程序

eclipse - Eclipse 中的 Maven/AJDT 项目

java - 在 ant 中设置类路径的问题

java - 100% 不可变,但仍然不是线程安全的