如何在Maven编译时忽略Java源代码目录?

27

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

Lombok Maven引入了一个新的代码生成目标,就在编译之前。在我的配置中,我的sourceDirectory(带有Lombok注解的Java文件,src/main/java)被处理生成没有Lombok注解的Java文件,保存在target/generated-sources/delombok文件夹下。

然而,现在sourceDirectory中的每个文件都有一个对应的同名文件存储在target/generated-sources/delombok中,这会导致由于重复的类而产生编译失败。

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

请注意,默认的Lombok Maven配置要求开发人员将带有Lombok注解的Java文件放在src/main/lombok文件夹中,而不是src/main/java。但是,我不想这样做,因为这会混淆IDE,并且如果我移除Maven插件,我的代码可以正常编译。

还请注意,仅仅重新定义sourceDirectory也会使IDE混乱(它们将不再知道从哪里找到Java源代码!)。

6个回答

34
最近我从使用不稳定的maven-exec-plugin方法切换到使用lombok-maven-plugin生成javadoc工具的原始代码。我的设置如下:所有源代码位于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>

这似乎暂时解决了问题。

编辑:奖励,如何使用此设置生成适当的javadoc文档

<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>

这是一个很好的解决方法!但它不能帮助生成 Javadoc,Javadoc 将使用 src/main/java 创建。Lombok 有一个 RFE 开始生成更多的 Javadocs,因此这可能是未来解决方案的要求。 - fommil
1
@fommil 当然可以,请看我的编辑。我刚刚进行了测试,结果对我有效。 - TheLQ
太好了!这显然会减慢典型的编译/运行阶段,有没有一种方法只在创建javadocs时运行它? - fommil
1
@fommil 不是很需要。老实说,我只是等待,使用 lombok 的 94 个类只需要 5-10 秒钟的处理时间。不过我能想到两个选项:1)每次运行 javadoc 时运行 mvn lombok:delombok 或者 2)绑定到 pre-site,虽然除非你运行 mvn site,否则它不会运行。 - TheLQ
@fommil 只是一些后续,我发现用 process-sources 替换 generate-sources - TheLQ

3
创建一个新的 Maven 配置文件,并在新的配置文件中重定义源代码。您可以参考Maven 配置文件介绍
<sourceDirectory>target/generated-sources/delombok</sourceDirectory>

另外一个方案

  1. 构建助手: 有一个构建助手似乎提供了这个功能,但我之前没有使用过。
  2. 黑科技: 这里有一个黑科技的方法,但作者不建议使用,而且如果你花时间修改POM并创建这个黑科技,最好按照正确的方式实现一个配置文件。

“配置文件方法可能是一个不错的方式 - 这样可以使用配置文件来构建包和 javadocs,而默认配置文件可以完全忽略 delomboking。谢谢!我会暂时将此问题保持未解决状态,以查看是否有人提出不需要单独为开发和打包创建配置文件的解决方案。” - fommil
好的,我已经更新了我的答案,并提供了一个你可以实现的hack,但是我和原作者都不建议这样做 :) - opyate
2
啊...事实证明在配置文件中无法重置<code>sourceDirectory</code>。它是不能被更改的<code>build</code>元素之一。 - fommil
可以通过在配置文件中设置附加属性来设置源目录:https://dev59.com/zGIk5IYBdhLWcg3wl_Ap#19142756 - kapex

2
“delombok”目标旨在将Java代码从“src/main/lombok”转换为“target/generated-source/delombok”。然后,找到“src/main/java”中的其他Java代码与“target/generated-source/delombok”结合起来生成组合的Java类。
“可以将delombok视为源代码生成器。”
“那么你如何获得真正想要的东西呢?”(请注意,Maven有一个addCompileSourceRoot方法,但没有相应的“removeCompileSourceRoot”方法。)想象以下“hack”:
将默认的<build><sourceDirectory>src/main/java覆盖为${project.build.directory}/generated-sources/delombok。同时,将默认的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使用此方法存在一定风险。(我猜这可能会让您的IDE和其他开发人员感到困惑。)

2
我尝试使用其他答案中提供的解决方案,但是IntelliJ仍然将我的源文件从src/main/java标记为重复。所以我决定在编译后摆脱delombok的内容。最终,该文件夹仅用作编译的中间阶段(在我的情况下,需要使用带有AspectJ编译器的lombok),并且没有真正保留它的必要性。我通过配置clean插件的附加执行来实现这一点,该插件将专门针对delombok文件夹进行操作。
您的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>

1

我在Intellj中遇到了类似的问题,以下方法对我有用:

IntellIJ IDEA -> 首选项 -> 构建、执行、部署 -> 编译器 -> 用户本地构建过程VM选项(覆盖共享选项):-Djps.track.ap.dependencies=false


0

看起来没有很好的方法来设置Lombok Maven。 @opyate建议的“配置文件”方法由于某些原因无法使用。

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

然而,一个非常丑陋的解决方法是简单地拥有另一个pom.xml,在每个方面都完全相同,只是重新定义了sourceDirectory,使用命令行参数来像下面这样使用该文件:

Maven替代pom


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接