6

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>

しかし残念なことに、ant タスクのloadpropertiesは失敗します。

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)

UPDATE 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 か... 迷っています。


答え:

これは以下のコメントです

これについて言及する必要がありました-何も変換する必要はありません。Doc: 「Ant 1.7 以降、文字エンコーディング ISO-8859-1 が文字からバイトへの変換に使用されるため、Java クラス ファイルを読み取るためにこのエンコーディングを使用する必要があります。」これは、生のバイトに対して文字フィルターが使用されているという事実を回避するための慣例にすぎません。ant.apache.org/manual/CoreTypes/… UTF-8 を使うのはまずいでしょう! – マクダウェル

4

3 に答える 3

1

クラップ、私はそれを知っていました!それはファイルエンコーディングの問題に帰着します。ファイルはまだISO-8819-1にありますが、私はUTF-8を使用しています。プロジェクトはかなり古く、間違ったエンコーディングで作成されました。javacおよびloadpropertiesタスクでパラメータエンコーディングを設定すると、修正されます。

<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の別の質問だと思います。

于 2009-05-18T12:13:07.130 に答える
1

loadpropertiesドキュメントには、ネストされたクラスパス要素はresource属性で使用するためのものであり、 srcfileを使用する代わりになると書かれています。

BCEL jar をグローバル クラスパスに追加します。Eclipse では、これをグローバル エントリとしてランタイム プリファレンスのクラスパスに追加します。コマンド ラインで、-libスイッチを使用します。

代替テキスト
(ソース: eclipse.org )

于 2009-05-18T09:55:58.360 に答える
0

クラスパスエラーのようです。「ant-v」を実行して、エラーの詳細を確認します。

于 2009-05-18T09:28:01.427 に答える