Maven 3 - 如何添加注释处理器依赖项?

我需要在项目的源代码上运行注释处理器。注释处理器不应成为项目的传递依赖项,因为它仅用于注释处理,而不需要其他任何内容。

以下是我用于此目的的完整(非工作)测试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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Test annotations</name>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hibernate-jpamodelgen.version>1.2.0.Final</hibernate-jpamodelgen.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
          <annotationProcessors>
            <annotationProcessor>
              org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor>
          </annotationProcessors>
          <debug>true</debug>
          <optimize>true</optimize>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArguments>
            <AaddGeneratedAnnotation>true</AaddGeneratedAnnotation>
            <Adebug>true</Adebug>
          </compilerArguments>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>${hibernate-jpamodelgen.version}</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>

我在测试的插件配置中明确定义为注释处理器,我知道它不应该是必需的。org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor

我遇到的问题是依赖项未添加到编译器类路径中,因此找不到注释处理器并且生成失败。hibernate-jpamodelgen

根据这个答案,我尝试将依赖项添加为构建扩展(不确定我是否理解这些应该是什么!),如下所示:

<extensions>
  <extension>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>${hibernate-jpamodelgen.version}</version>
  </extension>
</extensions>

这也不会添加到编译器类路径中。hibernate-jpamodelgen

到目前为止,我发现的唯一有效的方法是将依赖项添加到该部分中的项目中。这有一个不幸的副作用,即在之后添加为传递依赖项,我想避免这种情况。<dependencies>hibernate-jpamodelgen

我之前的工作设置使用插件来实现我想要的。但是,eclipse m2e不支持此插件,并且最新版本的现在可以正确处理多个编译器参数,因此我宁愿使用后者。maven-processor-pluginmaven-compiler-plugin


答案 1

annotationProcessorPaths 选项可用于最新版本的 Maven 编译器插件:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <annotationProcessorPaths>
                    <annotationProcessorPath>
                        <groupId>org.hibernate</groupId>
                        <artifactId>hibernate-jpamodelgen</artifactId>
                        <version>5.2.6.Final</version>
                    </annotationProcessorPath>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

这样,处理器就与实际的项目依赖项分开了。如果为项目启用了注释处理,Eclipse M2E 插件也会选取此选项。


答案 2

将依赖项添加为可选依赖项 ()。这将在编译下添加依赖项,但会阻止它成为传递依赖项:<optional>true</optional>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-jpamodelgen</artifactId>
  <version>${hibernate-jpamodelgen.version}</version>
  <optional>true</optional>
</dependency>

如果要在此模块中创建包含所有依赖项的项目(如 .war),则可以改用。这既可以防止依赖项可传递,又可以包含在模块生成的项目中。<scope>provided</scope>


推荐