【问题标题】:How to ignore the Java Source directory during Maven Compilation?如何在 Maven 编译期间忽略 Java 源目录?
【发布时间】:2012-07-05 00:13:49
【问题描述】:

我正在尝试使用Lombok Maven Plugin 来确保在使用Lombok 时正确创建Javadocs。

Lombok Maven 在编译之前引入了一个新的代码生成目标。在我的配置中,我的sourceDirectory(带有Lombok 注释的Java,src/main/java)被处理以在target/generated-sources/delombok 中创建Java(没有Lombok 注释)。

但是,sourceDirectory 中的每个文件现在在target/generated-sources/delombok 中都有一个对应的(同名)文件,导致由于类重复而导致编译失败。

如何让 Java 编译器忽略 sourceDirectory 中的源代码?

请注意,默认的 Lombok Maven 配置会让开发人员将 Java(带有 Lombok 注释)放在 src/main/lombok 文件夹中,而不是 src/main/java。但是,我不希望这样做,因为它会混淆 IDE,而且我的代码编译得很好(如果我删除了 Maven 插件)。

还要注意,简单地重新定义 sourceDirectory 也会让 IDE 感到不安(它们不再知道在哪里可以找到 Java 源代码!)。

【问题讨论】:

    标签: java maven lombok


    【解决方案1】:

    我最近从使用 flakey maven-exec-plugin 方法为 javadoc 工具生成原始源代码转换为使用 lombok-maven-plugin

    我的设置

    • src/main/java 中的所有来源
    • 生成的源进入target/generated-sources/delombok

    我最初遇到了这个问题,但它似乎很容易解决:不要让 lombok-maven-plugin 使用 addOutputDirectoy 将 delombok 路径添加到编译器源路径。浏览器

    <plugin>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok-maven-plugin</artifactId>
        <version>0.11.2.0</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>delombok</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <addOutputDirectory>false</addOutputDirectory>
            <sourceDirectory>src/main/java</sourceDirectory>
        </configuration>
    </plugin>
    

    这似乎暂时解决了这个问题

    编辑:奖励,如何使用此设置生成正确的 javadocs

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.8.1</version>
        <configuration>
            <defaultVersion>${project.version}</defaultVersion>
            <sourcepath>target/generated-sources/delombok</sourcepath>
        </configuration>
    </plugin>
    

    【讨论】:

    • 这是一个很好的解决方法!但它对使用src/main/java 创建的Javadoc 生成没有帮助。 Lombok 有一个 RFE 可以开始生成更多 Javadocs,因此这实际上可能是未来解决方案的要求
    • @fommil 当然可以,请参阅编辑。刚刚做了一个测试,它对我有用
    • 太棒了!这显然会减慢典型的编译/运行阶段,有没有办法只在创建 javadocs 时运行?
    • @fommil 不是。老实说,我只是等待,大量使用 lombok 的 94 个类只需要 5-10 秒来处理。虽然我能想到 2 个选项:1)在运行 javadoc 时运行 mvn lombok:delombok 或 2)改为绑定到 pre-site,尽管它不会运行,除非你执行 mvn site
    • @fommil 只是一些跟进,我发现将 generate-sources 替换为 process-sources
    【解决方案2】:

    创建一个新的Maven profile,并在新的配置文件中,重新定义来源:

    <sourceDirectory>target/generated-sources/delombok</sourceDirectory>
    

    或者

    1. 构建助手:有一个build helper 似乎提供了这个功能,但我以前没有使用过这个。
    2. Hack:有一个 hack described here,但作者建议不要这样做,此外:如果你打算花时间修改你的 POM 并创建这个 hack,你最好用正确的方式和实施配置文件。

    【讨论】:

    • 配置文件方法可能是一个很好的方法 - 这样配置文件可以用于构建包和 javadocs,而默认配置文件可以完全忽略 delomboking。谢谢!我会暂时不回答这个问题,看看是否有人提出了不需要单独的开发和打包配置文件的解决方案。
    • 好的,我已经用你可以实现的 hack 更新了我的答案,但我和原作者都不会推荐它:)
    • Argh... 结果是无法在配置文件中重置 sourceDirectory。它是无法更改的 build 元素之一。
    • 可以使用配置文件中设置的附加属性在配置文件中设置源目录:stackoverflow.com/a/19142756/897024
    【解决方案3】:

    delombok 目标旨在将 java 代码从 src/main/lombok 转换为 target/generated-source/delombok。然后,在src/main/java 中找到的其他java 代码与target/generated-source/delombok 组合生成组合的java 类。

    将 delombok 视为源代码生成器会有所帮助。

    那么你怎样才能得到你真正想要的呢?(注意 Maven 有一个 addCompileSourceRoot 方法,但没有相应的 removeCompileSourceRoot。)想象一下下面的 破解

    1. 将默认的&lt;build&gt;&lt;sourceDirectory&gt;src/main/java 覆盖为${project.build.directory}/generated-sources/delombok
    2. 将默认delombok sourceDirectorysrc/main/lombok 覆盖为src/main/java,并禁用addOutputDirectory

    基本上,您将使用src/main/java,但 Maven 会忽略它,而是使用target/generated-sources/delombok。 Lombok 插件会将src/main/java 转换为target/generated-sources/delombok 中的详细代码。

    <build>
      <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
      <plugins>
        <plugin>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok-maven-plugin</artifactId>
          <version>1.16.6.1</version>
          <executions>
            <execution>
              <id>delombok</id>
              <phase>generate-sources</phase>
              <goals>
                <goal>delombok</goal>
              </goals>
              <configuration>
                <addOutputDirectory>false</addOutputDirectory>
                <sourceDirectory>src/main/java</sourceDirectory>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    

    请注意,您不需要破解其他插件,例如 maven-jar-pluginmaven-javadoc-plugin,因为它们应该尊重 sourceDirectory

    使用此 hack 需要您自担风险。(我的猜测是这可能会让您的 IDE 和其他一些开发人员感到困惑。)

    【讨论】:

      【解决方案4】:

      我尝试使用其他答案中的解决方案,但 IntelliJ 仍会将来自 src/main/java 的源文件标记为重复。所以我只是决定在编译后摆脱delombok的内容。最后,该文件夹仅用作编译的中间阶段(在我的情况下,它需要将 lombok 与 AspectJ 编译器一起使用)并且没有真正需要保留它。我通过配置专门针对 delombok 文件夹的 clean 插件的额外执行来做到这一点。

      你的 POM 应该包含

      <build>
      
          <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
      
          <plugins>
              <!-- will delombok source files into /target/generated-sources/delombok -->
              <plugin>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok-maven-plugin</artifactId>
                  <version>1.16.16.0</version>
                  <executions>
                      <execution>
                          <phase>generate-sources</phase>
                          <goals>
                              <goal>delombok</goal>
                          </goals>
                      </execution>
                  </executions>
                  <configuration>
                      <addOutputDirectory>false</addOutputDirectory>
                      <sourceDirectory>src/main/java</sourceDirectory>
                  </configuration>
              </plugin>
      
              <!-- other plugins bound to compile phase should go here -->
      
              <plugin>
                  <artifactId>maven-clean-plugin</artifactId>
                  <executions>
                      <execution>
                          <id>delombok-removal</id>
                          <phase>compile</phase>
                          <goals>
                              <goal>clean</goal>
                          </goals>
                          <configuration>
                              <excludeDefaultDirectories>true</excludeDefaultDirectories>
                              <filesets>
                                  <fileset>
                                      <directory>${project.build.sourceDirectory}/com</directory> <!-- assuming your root package is something like com.mycompany -->
                                  </fileset>
                              </filesets>
                          </configuration>
                      </execution>
                  </executions>
              </plugin>
          </plugins>
      </build>
      

      【讨论】:

        【解决方案5】:

        似乎没有设置 Lombok Maven 的好方法。 @opyate 建议的“个人资料”方法不起作用,因为

        http://jira.codehaus.org/browse/MNG-5310

        然而,一个非常难看的解决方法是简单地拥有另一个pom.xml,除了重新定义sourceDirectory外,其他所有方面都相同,使用命令行参数来使用文件,如下所示:

        Maven alternate pom

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-09
          • 1970-01-01
          • 2015-10-20
          • 1970-01-01
          • 2012-10-13
          • 2011-11-27
          • 1970-01-01
          相关资源
          最近更新 更多