2

Java バージョン 6 を対象とした jar ファイルをコンパイルしていますが、Unsupported major.minor version 51.0. How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor versionなどのいくつかの投稿を読んだ後、問題を解決できず、以下で説明するように、問題を特定するために極端な手順を実行しました。

ソース コードから作成し、バージョン 6 を対象とする Xerces-For-Android jar をテストすることを目的として、Java サンドボックス プロジェクトを作成しました。ソース コードをプロジェクトに直接配置すると、コンパイルしてテスト プログラムを正常に実行します。ただし、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 を再起動します。

Antjarファイルの作成に使用しています。コードは非常に単純で、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 スクリプトを冗長モードで実行しました ( ant -verbose > build.log)...これにより、問題を特定するための詳細情報が得られました。これは、の「クリーン」タスクがant実行されていないという事実であり、"プロジェクトクリーン」をEclipseで。jar 内のマニフェスト ファイルは更新されていましたが、クラス ファイルは「最新」と表示されていたため、再作成されていませんでした。クリーン タスクを依存関係としてコンパイル タスクに追加した後、すべてが期待どおりに機能しました。誰かが同様の問題を抱えている可能性を考えて、この投稿を残してください。

4

3 に答える 3

2

ビルドを行う前に、すべてを完全にクリーンアップしてください。major.Minor は、必ずしも jar 自体ではなく、jar 内のクラスに対して発生します。

見つかった .class ファイルを調べて削除し、最初から再コンパイルします。

于 2013-09-18T16:59:20.837 に答える
1

Eclipse での自動コンパイルを無効にするか、コマンド ラインから ant を実行することをお勧めします。そしてする<javac verbose="true" ...>。JAVA_HOME セットと Ant インストールがあるかどうかを確認します。

Javac にはcompilerおよびsource属性もあります。

コードについては、dumpJavaClassVersionを参照してください。

于 2013-09-18T17:19:12.847 に答える