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

Jos*_*uaD 3 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
Run Code Online (Sandbox Code Playgroud)

所以看起来它正在使用Oracle的Java 9(安装在我的系统上)进行编译,但是我无法在eclipse中找到指定它的位置.我看到的一切似乎都表明我们正在使用java 8(截图如下).

我觉得我必须遗漏一些东西,但我无法弄清楚在哪里.为了让这个jar与Java 8/class文件版本52.0兼容,我该怎么办?

项目>属性> Java构建路径在此输入图像描述

项目>属性> Java编译器 在此输入图像描述

窗口>首选项>编译器 在此输入图像描述

右键单击Ant构建文件>运行方式>外部工具配置 在此输入图像描述

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>
Run Code Online (Sandbox Code Playgroud)

dat*_*atv 6

你的$JAVA_HOME环境变量是什么?

我最近遇到了类似的问题,结果发现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>
Run Code Online (Sandbox Code Playgroud)

这让我这样:

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
Run Code Online (Sandbox Code Playgroud)

我发现预测Ant将生成哪个版本的唯一可靠方法是强制执行以下操作build.xml:

<property name="ant.build.javac.source" value="1.7"/> 
<property name="ant.build.javac.target" value="1.7"/>
Run Code Online (Sandbox Code Playgroud)

所以,我向您推荐:尝试放入build.xml以下内容:

<property name="ant.build.javac.source" value="1.8"/> 
<property name="ant.build.javac.target" value="1.8"/>
Run Code Online (Sandbox Code Playgroud)

为了OP中描述的问题的变化,为了消除"Eclipse欺骗Ant"的任何可能性,更新:

  1. 转到Window > Preferences > Java > Installed JREs并尝试只保留目标JRE,确保它是JDK文件夹中的一个(而不是直接位于该Java文件夹下的兄弟文件夹).
  2. 转到Project > Properties > Java Compiler并检查Enable project specific settings,确保将编译器合规性级别设置为目标JRE java版本.