65

修正済み: これはmaven-compiler-plugin 3.1の既知のバグです。

1000 以上の Java ソース プロジェクトの Ant ベースのビルドを Maven に変換しています。これまでのところは問題ありませんが、起動するたびにmvn compileすべてを再コンパイルします (古いクラスを再利用する代わりに)

mvn -X compileレポートの使用

[DEBUG] Stale source detected: /project_path/src/main/java/package_path/AFile1.java
[DEBUG] Stale source detected: /project_path/src/main/java/package_path/AFile2.java
...

特定のパッケージ内のファイルのみ。残りのコードから参照されていない可能性があります。ソースではありません。ビルドをmavenizeしようとしています)

コンパイルは失敗せず、タイムスタンプが更新されたクラスが生成されています。

/project_path/target/classes/package_path/AFile1.class
/project_path/target/classes/package_path/AFile2.class
...

ただし、タイムスタンプを見ると、Java ファイルは昨日から変更されておらず、クラス ファイルは最新です。これらのソースが古いと判断されるのはなぜですか? この問題をデバッグするにはどうすればよいですか?

変更が発生していない場合でも、1k 以上のファイルを再コンパイルする必要があるのは面倒です...


出力例:

$ mvn clean compile
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building MyProject 1.9.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The POM for net.sourceforge:jffmpeg:jar:1.1.0 is missing, no dependency information available
[INFO] 
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ my-project ---
[INFO] Deleting /project_path/target
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ my-project ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /project_path/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-project ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1162 source files to project_path/target/classes
....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.215s
[INFO] Finished at: Tue Jul 30 12:42:25 CEST 2013
[INFO] Final Memory: 25M/429M
[INFO] ------------------------------------------------------------------------



$ mvn compile
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building MyProject 1.9.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[WARNING] The POM for net.sourceforge:jffmpeg:jar:1.1.0 is missing, no dependency information available
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ my-project ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /project_path/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-project ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1162 source files to /project_path/target/classes
... 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.140s
[INFO] Finished at: Tue Jul 30 12:42:44 CEST 2013
[INFO] Final Memory: 22M/379M
[INFO] ------------------------------------------------------------------------
4

9 に答える 9

39

これは、maven-compiler-plugin 3.1 の既知の問題です。https://issues.apache.org/jira/browse/MCOMPILER-209で追跡されています(useIncrementalCompilationフラグが壊れています)。

この問題は、別の 3.1 バグhttps://issues.apache.org/jira/browse/MCOMPILER-205とは無関係です(.class 出力を生成しないファイルには常に「古い」フラグが付けられます)。

さらにテストした後、3.0 に戻っても実際には問題は解決しませんでした (それは次のmvn clean compile.コードベース全体の)。useIncrementalCompilationfalse

于 2013-07-30T13:12:04.567 に答える
13

同じ問題に直面しました。mvn compileオプションを指定したMavenは、問題がファイル-Xによって引き起こされていることを示しました。package-info.java

[デバッグ] 古いソースが検出されました: .../package-info.java

問題は、.class 用に生成された.classファイルがないことですpackage-info.java

解決策は、この PR で見つかりました: https://github.com/apache/flink/pull/5644/files referencing MCOMPILER-205

<compilerArgs>
    <arg>-Xpkginfo:always</arg>
</compilerArgs>

つまり:

すべての package-info.java ファイルに対して常に package-info.class を生成します。

于 2019-07-12T09:41:17.910 に答える
4

理由はわかりませんが、私の場合、tucuxiの回答の解決策は機能しません。私のプロジェクトには、特別なツールによって生成された何千ものファイルがあり、その再コンパイルは本当に多くの時間を浪費する可能性があります.

次のプラグイン構成を試しました(Javaレベル1.5を使用):

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
        <useIncrementalCompilation>true</useIncrementalCompilation>
    </configuration>
</plugin>

2 回目の実行では、古いファイルは検出されませんでしたが、プラグインはすべてのプロジェクトを再コンパイルしました。インクリメンタル コンパイルは実際にはデフォルトで無効になっているようで、useIncrementalCompilation=true を指定しても機能しません。

グーグルで調べた後、 useIncrementalCompilation パラメータ値を「true」から「yes」に変更しただけで、これでうまくいきました。

@ stackoverflow.com/a /19653164/1848640も参照

于 2014-03-21T13:20:50.167 に答える
1

クラス名とファイル名が一致しない場合も、このエラーが発生します。

于 2020-07-15T17:19:13.863 に答える