【问题标题】:Unsupported major.minor version 51.0 Error With Eclipse When Trying to Reference Jar File尝试引用 Jar 文件时,Eclipse 出现不支持的 major.minor 版本 51.0 错误
【发布时间】:2015-03-21 22:48:09
【问题描述】:

我正在编译一个针对 java 版本 6 的 jar 文件,但是我收到了一个与 Unsupported major.minor version 51.0 相关的错误。在阅读了几篇帖子(例如How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version)后,我无法解决我的问题,并采取了极端措施来尝试隔离问题,如下所述。

我创建了一个 java 沙盒项目,其目的是测试我从源代码制作并定位到版本 6 的 Xerces-For-Android jar。如果我将源代码直接放入项目中,我可以成功编译并运行我的测试程序。但是,如果我创建一个 jar 文件,然后将其添加到我的构建路径中,我会得到 Unsupported major.minor version 51.0

阅读几篇帖子,Unsupported major.minor version 51.0 似乎是基于不同 java 版本编译的问题。版本 51.0 看起来是 java 7。为了简单地进行测试,我从我的机器上卸载了所有 Java 7 安装,确保我的 eclipse 项目指向相同的 Java 6 JRE,并且我的 JAVA_HOME 设置为 Java 6u45。我还重新启动 eclipse 以确保我的更改到位。

我正在使用Ant 创建 jar 文件。代码非常简单,我什至将 javac 目标指定为 1.6。

<project name="XercesForAndroid" default="dist" basedir=".">
    <description>
        Builds jar for Xerces-For-Android
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

  <target name="init">
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init" description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac target="1.6" srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the .jar file -->
    <jar jarfile="${dist}/lib/Xerces-For-Android.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

运行 ant 脚本后,我使用 7-zip 检查 jar,发现清单显示使用 6u45 制作它。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)

对我可能遗漏的内容有什么想法吗?我看不出如何再引用 Java 7,但它似乎是基于 51.0 引用...

其他一些旁注:

  1. 我手动删除了 .jar 文件,并对 Xerces-For-Android 项目进行了清理,以确保周围没有旧的二进制文件。
  2. 我还对我的沙盒项目进行了清理,以测试 jar 文件的使用。同样的问题。
  3. 卸载 Java 7 后,我重新安装了 java 6u45。通过 51.0 参考仍然没有运气。
  4. 根据 Joop Eggen 的要求,我在 eclipse 中验证了编译器设置:

解决办法:

根据 Joop Eggen 的要求,我以详细模式 (ant -verbose &gt; build.log) 运行了 ant 脚本...这为我提供了更多信息来识别问题,这是因为 ant 的“清理”任务是不运行,这与eclipse中的“项目清理”不同。 jar 中的清单文件正在更新,但类文件没有被重新创建,因为它们显示为“最新”。在将 clean 任务作为依赖项添加到 compile 任务后,一切都按预期工作。如果有人遇到类似问题,请不要写这篇文章。

【问题讨论】:

  • 总结:您不能在 java 6 JVM 上运行为 java 7 编译的类。有问题的类是 jar 中的类。
  • 我正在编译 jar 并针对版本 6,如帖子所述。

标签: java eclipse ant


【解决方案1】:

确保在构建之前彻底清除所有内容。 Major.Minor 发生在 Jar 中的类上,不一定是 jar 本身。

检查并删除您可以找到的所有 .class 文件,然后从头开始重新编译。

【讨论】:

  • 我更新了我的笔记,包括我关于这个问题的故障排除步骤......同样的问题。
【解决方案2】:

在 Eclipse 中禁用自动编译,或者最好从命令行运行 ant。并做&lt;javac verbose="true" ...&gt;。检查是否有 JAVA_HOME 设置和 Ant 安装。

Javac 还有compilersource 属性。

可能是偏执并检查 .class 文件,代码见dumpJavaClassVersion

【讨论】:

  • 您的回答将我引向了核心问题,与详细命令一样,很明显 ant clean 任务没有运行,它清理了与 eclipse 的 clean 不同位置的文件。谢谢,这让我发疯了。
【解决方案3】:

如果您使用 maven 构建项目,请参见下文。确保您相应地指定源和目标。我在 1.7 中编译时遇到了这个错误(同时保留了 1.7),但在 amazon beanstalk 上发现它是 1.6

<build>
<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ -->
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
</plugins>
</build>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2012-09-02
    • 2016-03-08
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多