Ant のロードプロパティが失敗しました (bcel エラー?)
-
22-08-2019 - |
質問
私は、Java クラス ファイルからいくつかの定数を取得し、それらをファイル名のバージョン番号として使用する単純なビルド スクリプトに取り組んでいます。私は Eclipse と独自の Ant を使用していますが、 bcel-5.2.jar libs フォルダーと Ant 呼び出しのクラスパスに追加します。
<target name="generate_version" depends="compile">
<loadproperties srcfile="${dir.dest}/MyVersion.class">
<classpath>
<fileset dir="${dir.libs}">
<include name="**/bcel*.jar"/>
</fileset>
</classpath>
<filterchain>
<classconstants/>
</filterchain>
</loadproperties>
</target>
しかし残念なことに、アリのタスクは ロードプロパティ 失敗します:
build.xml:46: expected a java resource as source
その後、次のコマンドラインを使用して、Eclipse の外部から Ant を実行しようとしました。
set ANT_HOME=C:\Program Files\Java\ant\apache-ant-1.7.1
"%ANT_HOME%\bin\ant.bat"
結果は
Buildfile: build.xml
init:
[echo] Building project.
[echo] ant.home: C:\Program Files\Java\ant\apache-ant-1.7.1
[echo] ant.java.version: 1.6
[echo] ant.version: Apache Ant version 1.7.1 compiled on June 27 2008
compile:
[javac] Compiling 262 source files to **********\build
[javac] Note: Some input files use or override a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
generate_version:
BUILD FAILED
********************\ant\build.xml:46: expected a java resource as source
私は今本当に迷っています。bcelエラーでしょうか?それは、私自身の bcel との Ant の非互換性ですか?
最後のヒント:Ant ターゲットから bcel クラスパス エントリを削除すると、次のようになります。
Buildfile: build.xml
init:
[echo] Building project.
[echo] ant.home: C:\Program Files\Java\ant\apache-ant-1.7.1
[echo] ant.java.version: 1.6
[echo] ant.version: Apache Ant version 1.7.1 compiled on June 27 2008
compile:
[javac] Compiling 262 source files to ********************\build
[javac] Note: Some input files use or override a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
generate_version:
BUILD FAILED
java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassParser
at org.apache.tools.ant.filters.util.JavaClassHelper.getConstants(JavaClassHelper.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
アップデート Eclipse で Ant 設定を設定した後、エラー メッセージが変わりました。
BUILD FAILED
*********************\build.xml:46: org.apache.bcel.classfile.ClassFormatException: is not a Java .class file
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:115)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
おそらく Ant と BCEL の間のバージョンの競合ではないかと思います。またはBCELとJDK1.6。あるいは、Eclipse と BCEL と Ant または JDK...道に迷いました。
答え:
以下にあるコメントです
これについては言及すべきでした。何も変換する必要はありません。ドクター:「ANT 1.7以来、ISO-8859-1をコードする文字は、文字からバイトに戻るために使用されるため、Javaクラスファイルを読むためにこのエンコードを使用する必要があります。」これは、キャラクターフィルターが生のバイトで使用されているという事実を回避するための慣習にすぎません。ant.apache.org/manual/CoreTypes/… UTF-8 を使用するとダメです。– マクダウェル
解決
クソ、わかってたよ!それはファイルのエンコードの問題に帰着します。ファイルはまだ ISO-8819-1 ですが、UTF-8 を使用しています。このプロジェクトはかなり古く、間違ったエンコーディングで作成されました。パラメータの設定 エンコーディング の中に ジャバック そして ロードプロパティ タスクがそれを修正します。
<target name="generate_version" depends="compile">
<loadproperties encoding="iso-8859-1" srcfile="${dir.dest}/MyVersion.class">
<filterchain>
<classconstants/>
</filterchain>
</loadproperties>
</target>
Subversion サーバーによって変更されたのかと思いましたが、すべてのファイルを自分で UTF-8 に変換する必要があるようです...それはSOにとって別の質問だと思います。
他のヒント
の のドキュメント ロードプロパティ 入れ子になっていると言います クラスパス 要素は、 リソース 属性 - を使用する代わりの方法 srcファイル.
BCEL jar をグローバル クラスパスに追加します。Eclipse では、グローバル エントリとしてクラスパスに追加します。 ランタイム設定. 。コマンドラインで、 -lib スイッチ。
(ソース: eclipse.org)
クラスパスエラーのようです。「ant -v」を実行すると、エラーの詳細が表示されます。