当前位置: 首页 > 知识库问答 >
问题:

Eclipse/Ant在版本1.9中制作了一个jar,尽管一切似乎都设置为1.8

季华茂
2023-03-14

我有一个使用ant和eclipse构建的项目,我希望它与Java8兼容。

当我尝试使用Java8运行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的Java9(安装在我的系统上)编译,但我在eclipse中找不到指定的位置。我看到的一切似乎都表明我们正在使用java 8(下面的屏幕截图)。

我觉得我一定错过了什么,但我不知道在哪里。我必须做什么才能让这个jar与Java8/class文件版本52.0兼容?

360-b185-ee46cbbf35fc.png" width="100%" height="100%" />

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>

共有2个答案

冯流觞
2023-03-14

除了datv上面所说的,我还将根据经验补充:

Ant的javacjavajunit任务都有一个jvm属性,如果fork=“true”,该属性决定如何运行JDK/JRE。不幸的是,它只设置原始启动器,而不更改所有其他设置。当我将jvm属性设置为java8jre的完整路径时,打开ant的-d开关表明它被用作可执行文件,但后面是

'-Djava.specification.version=9'
'-Dsun.boot.library.path=C:\Java\x64\jdk-9.0.1\bin'
'-Djava.home=C:\Java\x64\jdk-9.0.1'
'-Djava.runtime.version=9.0.1+11'
'-Djava.version=9.0.1'
'-Djava.library.path=...;C:\Java\x64\jdk-9.0.1\bin;.....
'-Djava.vm.version=9.0.1+11'
'-Djava.class.version=53.0'

所有这些优先。

事实证明,蚂蚁在启动时更关心JAVACMD环境变量。在上面的情况下,我们的构建框架将JAVACMD设置为C:\Java\x64\jdk-9.0.1\bin\java,并且特定任务上的单个jvm=可执行=属性...没有“忽略”真的,只是毫无意义和误导。

杨学真
2023-03-14

您的$JAVA\u HOME环境变量是什么?

我最近遇到了一个类似的问题,结果是Ant似乎忽略了Eclipse提供的许多设置,只使用$JAVA\u 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"/>

所以,我给你的建议是:试着把它放在构建中。xml包含以下内容:

<property name="ant.build.javac.source" value="1.8"/> 
<property name="ant.build.javac.target" value="1.8"/>

更新,对于那些在OP中描述的问题的变化的好处,以消除任何可能的"Eclipse愚弄蚂蚁":

  1. 转到窗口

 类似资料:
  • ldd找不到rpath定义中存在的dll。找到了其他一些库(check/./../lib/*) 这里是 ldd 的输出(我们可以看到在 ../lib,但不是自由 root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin#ldd./ade_adminlinux-vdso.so.1= root@hyperstream:/DT

  • 问题内容: 我正在使用xampp控制面板,然后从那里开始apache和mysql的过程。然后我转到mysql工作台,服务器状态似乎正常,这是一些信息 然后每次当我尝试为我的虚拟架构添加外键时: 我收到以下错误 那么,我该怎么做才能使xampp开始在mariaDb上使用mysql语法? 或者,如果我对问题的理解不正确,那么我应该怎么做,以便在使用xampp时不必再次面对此类问题? 问题答案: 问题是

  • 我知道这里描述的Java(和一般)中的比较规则。 我有一个字符串数组列表。 每个字符串代表一个德州扑克手,忽略花色。 每个字符串正好有13个字符长。 每个字符串仅由总和为7的数字组成。 例如,“0100300200100”代表一手由一张3、三张6、两张9和一张皇后组成的扑克。< br >(在这种情况下,这手牌代表满堂红-六加九)。 我想根据扑克手的力量对这个列表进行排序。 我有以下java代码,它

  • /Output: 课后,在主装载区内,糖果不能放口香糖。forName(“口香糖”)在创建Cooki后加载Cooki 这是我的代码和结果,找不到口香糖。 书中给出了一个java的Rtti示例,结果如下: 这似乎是一门课。forName()不起作用,无法初始化。

  • 这看起来很奇怪,在一个循环中有一个局部变量,为每个循环分配了新的值,我将该片附加到一个全局。循环完成后,全局切片内的所有值仅包含对该局部切片变量上最后一个值集的引用。 代码: 实际产出: 预期产出: 如果我删除行,那么它工作得很好。 我相信这和附加物有关 append内置函数将元素追加到片段的末尾。如果目的地具有足够的容量,则会重新许可该目的地以容纳新元素。 如果上面的条件是造成它的原因,那么在循

  • 问题内容: 我有一个没有GUI的程序,并且使用控制台!所以首先我从控制台的用户那里读了一行 BufferedReader userReader = new BufferedReader(new InputStreamReader(System.in)); 然后我将在控制台中为用户写一个答案! System.out.println(“ Server:” + output); 我要为此创建一个jar文