4

maven-compiler-pluginコードで注釈処理を実行するために Maven プロジェクトで使用しています。<fork>true</fork>構成オプションを追加するまでは機能していました。

pom.xmlファイルには以下が含まれます。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.5.1</version>
  <dependencies>
    <!-- Add dependency on the annotation processor -->
    <dependency>
      <groupId>x.y.z</groupId>
      <artifactId>my-processor</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
  <configuration>
    <source>1.7</source>
    <target>1.7</target>
  </configuration>
</plugin>

my-processor-1.0.jarファイルにはMETA -INF/services/javax.annotation.processing.Processorjavacファイルが含まれているため、実行時にコンパイラによって検出されます。

この構成でmvn clean compileを実行すると、予想どおり、注釈プロセッサが実行され、生成されたコードがtarget\generated-sources\annotationsディレクトリに配置されることがわかります。

しかし<fork>true</fork>、プラグイン構成にオプションを追加すると、注釈プロセッサが実行されず、target\generated-sources\annotationsディレクトリにコードが存在しないことがわかります。

maven-compiler-pluginバージョン 2.5.1、3.0、および 3.1 でこれを試しました (3.x バージョン<forceJavaCompilerUser>true</forceJavaCompilerUser>では、注釈プロセッサ jar が検出されるように構成にオプションを追加する必要がありました)。

また、アノテーション プロセッサを明示的に指定してみました。

<configuration>
  ...
  <annotationProcessors>
    <annotationProcessor>x.y.z.MyProcessor</annotationProcessor>
  </annotationProcessors>
  ...
</configuration>

繰り返しになりますが、バージョン 2.5.1、3.0、および 3.1 では、構成オプションでフォークが指定されていない場合、アノテーション プロセッサが呼び出されます。オプションが指定されている場合<fork>true</fork>、注釈プロセッサは実行されません。

また、アノテーション プロセッサの依存関係が確実に読み込まれるようにx.y.z:my_processor、依存関係の外に依存関係を追加しました。maven-compiler-plugin

maven-compiler-pluginが で設定されている場合でも注釈処理は機能し<fork>true</fork>ますか? それとも、プラグインの設定が間違っていますか?

コンパイルを別々の実行に分割したくないことに注意してください (たとえば、 を使用して注釈処理なしでコンパイルする実行と、 を使用<fork>true</fork>して注釈処理のみを行う別の実行<fork>false</fork>。これを回避する方法がない限り、何千ものソース ファイルを処理する必要があります)。

JDK 1.7.0_45 を使用しています。

編集#1

実際の解決策は、プロセッサの依存関係をプラグインの依存関係から通常の依存関係に移動することでした。

<dependencies>
  <dependency>
    <groupId>x.y.z</groupId>
    <artifactId>my-processor</artifactId>
 </dependency>
 ...
</dependencies>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <source>1.7</source>
      <target>1.7</target>
      <fork>true</fork>
    </configuration>
  </plugin>
</plugin>

これをテストしたと思っていましたが、生成されたコードの存在を探すのではなく、コンソール出力 (プロセスがフォークされたときに表示されない) を探していたのかもしれません。

4

2 に答える 2

2

fork モードで maven によって呼び出されたときに javac にcompilerArgsオプションを渡すには、オプションを使用する必要があります。-processor

于 2014-10-07T07:36:52.487 に答える
1

実際の解決策は、プロセッサの依存関係をプラグインの依存関係から通常の依存関係に移動することでした。元の投稿の編集 #1 を参照してください。

奇妙なことに、依存関係が追加された場合と依存関係が追加されていない場合では、コンパイル エラーが発生します。依存関係がない場合、内部専用 API の使用に関するコンパイラの警告が表示されます。注釈プロセッサの依存関係が追加されると、その警告はエラーとして扱われます。-Werrorコンパイラ オプションに、警告をエラーとして扱うオプションがありません。注釈プロセッサの依存関係が削除されると、コンパイルは警告付きで成功します。これに頭をかいて...

于 2014-10-08T23:10:29.927 に答える