运维开发网

Java Eclipse / Ant在版本1.9中创建一个jar,即使一切似乎都设置为1.8

运维开发网 https://www.qedev.com 2020-04-10 15:31 出处:网络 作者:运维开发网整理
我有一个使用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
我有一个使用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 / class文件版本52.0兼容,我该怎么办?

项目>属性> Java Build Path

Java Eclipse / Ant在版本1.9中创建一个jar,即使一切似乎都设置为1.8

项目>属性> Java编译器

Java Eclipse / Ant在版本1.9中创建一个jar,即使一切似乎都设置为1.8

窗口>偏好>编译器

Java Eclipse / Ant在版本1.9中创建一个jar,即使一切似乎都设置为1.8

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

Java Eclipse / Ant在版本1.9中创建一个jar,即使一切似乎都设置为1.8

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欺骗Ant”的任何可能性,更新:

>转到窗口>偏好> Java>安装JRE并尝试只保留目标JRE,确保它是JDK文件夹中的一个(而不是直接位于Java文件夹下的兄弟文件夹).>转到项目>属性> Java编译器并选中启用项目特定设置,确保将编译器合规性级别设置为目标JRE java版本.

0

精彩评论

暂无评论...
验证码 换一张
取 消