How do I run annotation processing via maven 3.3?

2019-01-28 08:09发布

问题:

For years, we've been running the maven-processor-plugin as a separate goal (using proc:none on maven-compiler-plugin). We are finally upgrading from maven 3.0.5 to the latest 3.3.3, and I see that the maven-processor-plugin basically looks dead. As far I a can tell, it has not been migrated out of google code.

We're using annotation processing primarily to generate dagger classes. I can't remember the reasons, but at the time (in dagger-1), we got the impression it is better to do this during generate-sources and generate-test-sources phases rather than during the compile and test-compile, which is why we used the maven-processor-plugin to begin with. Note that we want it all to play nicely in eclipse/m2e as well.

Is there a new, better way to run annotation processing from maven that is eclipse-friendly?

回答1:

You can use the maven-compiler-plugin for annotation processing because the functionality exists in javac. To do annotation processing and regular compilation in separate phases, you can do multiple executions of the plugin, one with annotation processing turned on, the other with it turned off. The configuration for that is as follows:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5</version>
    <executions>
        <execution>
            <id>process-annotations</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <compilerArgs>
                    <arg>-proc:only</arg>
                    <arg>-processor</arg>
                    <arg>MyAnnotationProcessor</arg>
                </compilerArgs>
            </configuration>
        </execution>
        <execution>
            <id>default-compile</id> <!-- using an id of default-compile will override the default execution -->
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <compilerArgs>
                    <arg>-proc:none</arg>
                </compilerArgs>
            </configuration>
        </execution>
    </executions>
</plugin>