如何在Maven编译期间忽略Java Source目录?

时间:2012-07-04 13:22:05

标签: java maven lombok

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

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源代码!)。

5 个答案:

答案 0 :(得分:24)

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

我的设置

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

我最初遇到了这个问题,但它似乎是一个简单的修复:不要让lombok-maven-plugin使用addOutputDirectoy将delombok路径添加到编译器源路径。 IE

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

这似乎解决了现在的问题

编辑:Bonus,如何使用此设置生成正确的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>

答案 1 :(得分:3)

创建一个新的Maven profile,在新的个人资料中,只需重新定义来源:

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

<强>替代地

  1. 构建助手:有一个build helper似乎提供了这个功能,但我之前没有用过。
  2. Hack:有一个hack described here,但作者建议反对它,此外:如果你要花时间修改你的POM并创建这个hack,你也可以做正确的事情方式并实施个人资料。

答案 2 :(得分:2)

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

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

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

  1. <build><sourceDirectory>的默认src/main/java覆盖为${project.build.directory}/generated-sources/delombok
  2. sourceDirectory的默认delombok src/main/lombok覆盖为src/main/java,并停用addOutputDirectory
  3. 基本上,您将使用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和其他一些开发人员感到困惑。)

答案 3 :(得分:0)

似乎没有很好的方法来设置Lombok Maven。 @opyate建议的“配置文件”方法因

而无效

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

然而,一个非常丑陋的解决方法是简单地使用另一个pom.xml,除了重新定义sourceDirectory之外,在各方面都相同,使用命令行参数来使用文件,如:

Maven alternate pom

答案 4 :(得分:0)

我尝试使用其他答案中的解决方案,但是IntelliJ仍会将来自src/main/java的源文件标记为重复。因此,我决定在编译后摆脱delombok的内容。最后,该文件夹仅是服务器作为编译的中间阶段(在我的情况下,要求将Lombok与AspectJ编译器一起使用),并且没有必要保留它。我通过配置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>