web-dev-qa-db-ja.com

Mavenアノテーション処理プロセッサーが見つかりません

私は注釈処理に不慣れで、Mavenでそれを自動化しようとしています。私はこれをpom.xmlに入れました:

<plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <annotationProcessors>
                    <annotationProcessor>
                        co.aurasphere.revolver.annotation.processor.InjectAnnotationProcessor</annotationProcessor>
                    <annotationProcessor>
                        co.aurasphere.revolver.annotation.processor.RevolverContextAnnotationProcessor</annotationProcessor>
                </annotationProcessors>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>

問題は、プロジェクトをビルドしようとすると、Mavenがプロセッサーを見つけられないため、CompilationFailureExceptionが発生することです。

プラグインの外に依存関係を置くことで解決される、このような他の質問を見つけました。私はそれを試しましたが、何も変わりませんでした。

私は何かが足りないのですか?

ありがとうございました。

[〜#〜]編集[〜#〜]

プロセッサとアノテーションの両方を含む別のプロジェクトへの依存関係は次のとおりです。

    <dependencies>
    <dependency>
        <groupId>co.aurasphere</groupId>
        <artifactId>revolver-annotation-processor</artifactId>
        <version>0.0.3-SNAPSHOT</version>
    </dependency>
</dependencies>

編集2

さらに調査した後、プロセッサJAR(Mavenでビルド)を逆コンパイルすることにしましたが、たまたま...私のクラスがありません。いくつかの理由で、Mavenは私のクラスをJARにコンパイルしておらず、そのためクラスが見つかりません。私はそのビルドの何が問題なのかを理解しようとしました(これは以前は私には起こらなかったので、しばらくの間Mavenを使用していました...)。

まず第一に、そのプロジェクトのパッケージはjarです。クラスはすべてsrc/main/Javaの下にあります。 pom.xmlで、クラスパスとソースパスが同じであることを確認しました。

これがプロセッサpomです:

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>co.aurasphere</groupId>
<artifactId>revolver-annotation-processor</artifactId>
<version>0.0.3-SNAPSHOT</version>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins> 
</build>
<dependencies>
    <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.Apache.velocity/velocity -->
    <dependency>
        <groupId>org.Apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>


</dependencies>

編集3

ここ は、プロセッサプロジェクトでのMavenクリーンインストールの出力です。残念ながら、出力が長すぎるため、良くないことがわかっていても、外部リンクを投稿する必要がありました。

編集4

これが私の依存関係階層のスクリーンショットです: Eclipse および File System

プロジェクトは元々Eclipsesimple Javaプロジェクトとして作成され、その後Mavenプロジェクトに変換されたため、新しいMavenプロジェクトを作成し、問題が発生することを期待してすべてを新しいプロジェクトに移動しようとしました。何かを台無しにしたEclipseプラグインでしたが、エラーはまだありました。

7
Aurasphere

私は自分で答えを見つけました。問題は、アノテーションプロセッサのクラスの設定を含むMETA-INF/services /内のファイルjavax.annotation.processing.Processorであることがわかりました。この問題を修正するために、プロセッサプロジェクトのpom.xml構成に以下を追加する必要がありました。

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <compilerArgument>
                    -proc:none
                </compilerArgument>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

これにより、Mavenはクラスを実際のjarに組み込み、問題を修正しました。これがバグかどうかはわかりませんが、確かに奇妙に見えます。みんな助けてくれてありがとう!

4
Aurasphere

これは、@ Aurasphereによって提供された上記の承認された回答の拡張バージョンです。うまくいけば、これは提案されたソリューションがどのように機能するかについての説明を与えるでしょう。

まず、ここで起こっていることの背景。たとえば、カスタムの注釈プロセッサが必要だとします。他のプロジェクトで使用できるように、実装してMavenアーティファクトとしてJARに入れます。このようなプロジェクトをコンパイルするときは、アノテーションプロセッサをJavaコンパイラで認識し、適切に使用する必要があります。これを実現するには、新しいカスタムプロセッサについてコンパイラに通知する必要があります。コンパイラの外観リソースで、META-INF/services/javax.annotation.processing.ProcessorファイルにリストされているクラスのFQNをチェックします。クラスパスでこれらのクラスを見つけてロードし、クラスで使用されるアノテーションの処理を実行しようとします現在コンパイル中

したがって、カスタムクラスをこのファイルに記載する必要があります。ライブラリのユーザーにこのファイルを手動で配置するように依頼することはできますが、これは直感的ではなく、ユーザーは、約束された注釈の処理が機能しない理由に不満を感じる可能性があります。そのため、このファイルを事前に準備して、MavenアーティファクトのJAR内のプロセッサーと一緒に配信することをお勧めします。

問題は、カスタムプロセッサのFQNを含むこのファイルを単純に配置すると、コンパイラがトリガーされることですアーティファクトのコンパイル中プロセッサ自体はまだコンパイルされていないため、コンパイラは次のように表示します。それについてのエラー。したがって、これを回避するには、注釈処理をスキップする必要があります。これは、-proc:noneを使用するか、Mavenを使用して実行できます。

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <proc>none</proc>
    </configuration>
</plugin>

アノテーションプロセッサを必要とする単体テストがあるかもしれません。 Mavenでは、メインソースがビルドされた後にテストコンパイルが実行され、プロセッサを含むすべてのクラスがすでに利用可能です。アノテーションプロセッサを使用するテストソースの処理中に特別なステップを追加する必要があります。これは、以下を使用して実行できます。

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
        <execution>
            <id>process-test-annotations</id>
            <phase>generate-test-resources</phase>
            <goals>
                <goal>testCompile</goal>
            </goals>
            <configuration>
                <proc>only</proc>
                <annotationProcessors>
                    <annotationProcessor>fully.qualified.Name</annotationProcessor>
                </annotationProcessors>
            </configuration>
        </execution>
    </executions>
</plugin>
8
scrutari

最も簡単な方法は、revolver-annotation-processorアーティファクトのMETA-INF/servicesディレクトリに注釈プロセッサを登録することです。 Mavenコンパイラー構成は必要ありません。

すでに登録されているか確認してください。登録されていない場合は、ソースコードを管理している場合は自分で登録してください。

https://docs.Oracle.com/javase/8/docs/api/Java/util/ServiceLoader.html

ソースコードを制御する場合は、アノテーションと同じアーティファクトにプロセッサをパッケージ化することもお勧めします。このように、注釈の1つを使用しているときはいつでも、注釈プロセッサもコンパイラによって取得されます。

1
Puce