7

Ant 1.8.0 と Java 1.6.0.17 を使用していますが、奇妙な問題が発生しています。

私のbuild.xmlには、コードをコンパイルする簡単なタスクがあります

<javac destdir="${dir.build.classes}" debug="on">
    <classpath refid="classpath"/>
    <src path="${dir.src.java}"/>
</javac>

「クラスパス」にはjarがあり、それを呼び出しますlibrary.jar

後のタスクで、いくつかのクラスを に追加する必要がありますlibrary.jar

<jar destfile="library.jar" update="true" duplicate="fail">
    <fileset dir="${dir.build.classes}">
        <include name="some/class/files"/>
    </fileset>
</jar>

これはエラーで失敗します Unable to rename old file (library.jar) to temporary file

javac 呼び出しの前後に handle.exe の呼び出しにスタックしました。ant を実行している Java プロセスが、javac 呼び出し中に library.jar へのファイル ハンドルを取得し、放棄していないことを確認できます。これにより、後でjarを更新しようとして失敗します。

javac タスクが完了した後でも、ant がクラスパス内の jar へのハンドルを開いたままにしておくのはなぜですか?

4

5 に答える 5

5

それで、いくつかの実験の後、答えを見つけました。fork="true"私のタスクに追加することで、javacタスクの最後にファイル ハンドルが閉じられます。これにより、ビルドの後半で jar の変更を成功させることができます。

残念ながら、上流のすべての javac タスクにこれを追加することを忘れないでください。

于 2010-02-23T15:17:19.263 に答える
3

これは、Windows のロックの問題です。ファイルを読み取るプロセス/スレッドは、既存のjarファイルを更新するときに、zipタスクが行っている名前の変更を防ぎます。

クラスパス参照を使用しているため、ファイルハンドルが開いたままになっていると思います。javac タスクのクラスパスを明示的に設定すると、ファイル ハンドルが閉じられる可能性があります。

于 2010-02-20T02:39:24.890 に答える
1

まったく同じ問題について報告されたバグがここにあります

彼らは、これは Ant バージョン 1.8 で修正されたと言っています。

于 2010-11-06T11:39:11.753 に答える
-1

クラスパス構成に関連しているようで、jar ファイルに対する最初の操作では、それを開いたままにします。「。」を削除することで、この問題を解決しました。私のクラスパス環境変数から。

于 2010-08-13T00:02:58.287 に答える