【问题标题】:Maven compile with multiple src directoriesMaven 编译多个 src 目录
【发布时间】:2010-09-21 04:34:37
【问题描述】:

有没有办法在单个 maven 项目中编译多个 java 源目录?

【问题讨论】:

    标签: java maven-2


    【解决方案1】:

    您可以使用 build-helper 添加新的源目录:

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>src/main/generated</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    【讨论】:

    • 这种方法的唯一问题是最终的工件也包括 java 源文件(.java 文件)。有没有办法排除源文件并只包含 .class 文件?
    • 只是给其他人(比如我)的注释,plugin 元素在/project/build/plugins 中,而不在/project/build/pluginManagement/plugins
    • 如果您使用的是 eclipse,您可能需要从 eclipse 市场安装 m2e connector for build-helper-maven-plugin 以消除 pom.xml 中的错误
    • 如果您收到类似'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missing 的警告,您需要在&lt;plugin&gt; 中添加标签&lt;version&gt;1.12&lt;/version&gt;
    • 因此,在 2017 年,最好的方法是创建 XML Pasta。没有人认为这有问题吗?
    【解决方案2】:

    我天真地这样做了:

    <build>
      <finalName>osmwse</finalName>
      <sourceDirectory>src/main/java, src/interfaces, src/services</sourceDirectory>
    </build>
    

    【讨论】:

    • 为我工作:) Eclipse 似乎并不喜欢它。似乎认为“src/main/java, src/interfaces”是单个 src,因此将其标记为(缺失)。
    • 对我来说,这导致 Maven 3.2.2 找不到任何来源。
    • 我有与@Joel 类似的经历,代码已编译,但在识别“主要”方法等问题上遇到了问题。
    • 对于 maven 3.8.1 不起作用。此外,在这个版本的 maven 的文档中,没有任何地方写到标签 中可能有这样的内容。 --- maven-compiler-plugin:3.8.1:compile (default-compile) @ xxx-xxx --- 没有要编译的源代码
    • 曾在 netbeans 中工作,并没有破坏 intelliJ 或 Eclipse。
    【解决方案3】:

    这对我有用

    <build>
        <sourceDirectory>.</sourceDirectory>
        <plugins>
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
            <includes>
                <include>src/main/java/**/*.java</include>
                <include>src/main2/java/**/*.java</include>
            </includes>
            </configuration>
            </plugin>
        </plugins>
    </build>
    

    【讨论】:

    • 恕我直言,这不是一个好主意,因为几个插件假定sourceDirectory - 可能还有额外的sources - 作为源文件的根。在您的解决方案中,maven-compiler-plugin 是唯一知道这些实际根的插件。
    • @Laurent 你说得对。几年前这是一个好主意,但现在有更好的选择。上面列出的 build-helper 是我的首选。
    • 这不会将它添加到项目模型中,因此它在 IDE 中无法正常工作。
    • +1 @sal 它就像一个具有 WAR 项目依赖项的魅力。
    • 如果我想包含一个外部源目录(包含我在我的 maven 项目中使用的 Java 类),这将无法工作。如果我的外部源位于我的 Eclipse 工作区之外怎么办?我能做什么?
    【解决方案4】:

    要使其在 intelliJ 中工作,您还可以通过这种方式将 generatedSourcesDirectory 添加到编译器插件:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>
        </configuration>
    </plugin>
    

    【讨论】:

    • 想补充一点,这在 Eclipse 中也可以工作,并将生成的源代码添加为项目配置中的源位置。
    • 这条路径似乎是用于注释处理器生成的源。即使它有效,某些插件也可能以不同方式处理此路径。例如,我希望在运行 'clean' 时可以删除此目录。
    • 你把它放在哪里了?
    • IntelliJ 2021.2.3 这仍然有效,这是我发现的唯一解决方案。我同意@kapex 的观点,它是用于注释的,但我花了一天时间试图找到“正确的方法”来做这件事,但失败了。
    • 为了让构建不那么脆弱,更符合 maven 标准:&lt;generatedSourcesDirectory&gt;${project.build.directory}/generated-sources/main/java&lt;/generatedSourcesDirectory&gt;
    【解决方案5】:

    通过定义资源标签,这也适用于 maven。您可以随意命名您的 src 文件夹名称。

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.java</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
    
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.java</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
    
            <resource>
                <directory>src/main/generated</directory>
                <includes>
                    <include>**/*.java</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    

    【讨论】:

    【解决方案6】:

    这适用于 maven 3.5.4,现在 Intellij Idea 将此代码视为源代码:

    <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.3</version>
         <configuration>
             <generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>                    
         </configuration>
    </plugin>
    

    【讨论】:

      【解决方案7】:

      虽然来自 evokk 的答案基本上是正确的,但它缺少 测试类。 您必须添加目标为 add-test-source 的测试类:

      <execution>
          <phase>generate-sources</phase>
          <goals>
              <goal>add-test-source</goal>
          </goals>
          <configuration>
             <sources>
                  <source>target/generated/some-test-classes</source>
              </sources>
          </configuration>
      </execution>
      

      【讨论】:

        【解决方案8】:

        使用帖子中的 build-helper-maven-plugin - 并更新 src/main/generated。 mvn clean compile 在我的 ../common/src/main/java 或 ../common 上工作,所以保留后者。然后是的,确认 IntelliJ IDEA (ver 10.5.2) 级别的编译失败,正如 David Phillips 提到的那样。 问题是 IDEA 没有向项目添加另一个源根目录。手动添加它解决了这个问题。这不好,因为编辑项目中的任何内容都应该来自 maven,而不是直接编辑 IDEA 的项目选项。然而,我将能够忍受它,直到他们直接支持 build-helper-maven-plugin 以便它会自动添加源代码。

        然后需要另一种解决方法来完成这项工作。由于每次 IDEA 在 pom 更改后重新导入 maven 设置时,我新添加的源都保留在模块上,但它丢失了它的源文件夹选择并且没用。所以对于 IDEA - 需要设置一次:

        • 选择 - 项目设置/Maven/导入/保留源代码和测试 重新导入时的文件夹。
        • 添加 - 项目结构/项目设置/模块/{Module}/源/添加内容根目录。

        现在让这些文件夹保持在导入状态也不是世界上最好的做法,......但试试看吧。

        【讨论】:

        • 这两个选项都不适用于我使用的 IntelliJ Idea 9.0.4。还没有尝试使用最近的 Eclipse 的 build-helper 选项,但是当我尝试它时它不适用于 3.4 和 m2 插件。 Maven 不喜欢从同一个项目构建的多个源代码树或多个工件,任何试图绕过这个限制的尝试通常都是可怕的 hack。
        • 已经使用 IntelliJ 多年了。而且从来没有切换到eclipse,所以不能说话,然后听力一般也很好。对于 IntelliJ,每隔一年升级一次个人许可证的费用为每年 100 美元。新的主要版本通常在每年 1 月发布。然后在上一年的最后 2-3 个月,他们允许您购买以前的版本并免费升级到即将到来的版本。现在开始了,所以现在是购买 10 和获得 11 的“安全”时间。另外,如果您不需要 JSP 和其他企业功能,请使用免费的社区版。
        【解决方案9】:

        这可以分两步完成:

        • 您应该为每个源目录创建自己的模块。
        • 在所有模块中,您应该指定相同的构建目录:${build.directory}

        如果您使用已启动的 Jetty (jetty:run),则重新编译任何模块中的任何类(使用 Maven、IDEA 或 Eclipse)将导致 Jetty 重新启动。修改后的资源将获得相同的行为。

        【讨论】:

          【解决方案10】:

          在配置中,可以使用&lt;compileSourceRoots&gt;

          oal:          org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-cli)
          [DEBUG] Style:         Regular
          [DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
          <configuration>
            <basedir default-value="${basedir}"/>
            <buildDirectory default-value="${project.build.directory}"/>
            <compilePath default-value="${project.compileClasspathElements}"/>
            <compileSourceRoots default-value="${project.compileSourceRoots}"/>
            <compilerId default-value="javac">${maven.compiler.compilerId}</compilerId>
            <compilerReuseStrategy default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
            <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
            <debug default-value="true">${maven.compiler.debug}</debug>
            <debuglevel>${maven.compiler.debuglevel}</debuglevel>
            <encoding default-value="${project.build.sourceEncoding}">${encoding}</encoding>
            <executable>${maven.compiler.executable}</executable>
            <failOnError default-value="true">${maven.compiler.failOnError}</failOnError>
            <failOnWarning default-value="false">${maven.compiler.failOnWarning}</failOnWarning>
            <forceJavacCompilerUse default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
            <fork default-value="false">${maven.compiler.fork}</fork>
            <generatedSourcesDirectory default-value="${project.build.directory}/generated-sources/annotations"/>
            <maxmem>${maven.compiler.maxmem}</maxmem>
            <meminitial>${maven.compiler.meminitial}</meminitial>
            <mojoExecution default-value="${mojoExecution}"/>
            <optimize default-value="false">${maven.compiler.optimize}</optimize>
            <outputDirectory default-value="${project.build.outputDirectory}"/>
            <parameters default-value="false">${maven.compiler.parameters}</parameters>
            <project default-value="${project}"/>
            <projectArtifact default-value="${project.artifact}"/>
            <release>${maven.compiler.release}</release>
            <session default-value="${session}"/>
            <showDeprecation default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
            <showWarnings default-value="false">${maven.compiler.showWarnings}</showWarnings>
            <skipMain>${maven.main.skip}</skipMain>
            <skipMultiThreadWarning default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
            <source default-value="1.6">${maven.compiler.source}</source>
            <staleMillis default-value="0">${lastModGranularityMs}</staleMillis>
            <target default-value="1.6">${maven.compiler.target}</target>
            <useIncrementalCompilation default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
            <verbose default-value="false">${maven.compiler.verbose}</verbose>
          </configuration>
          

          这些是 3.8.1 版本的编译器插件可用的所有配置。不同的版本有不同的配置,您可以通过在通用 mvn 命令后使用 -X 运行代码来找到这些配置。喜欢

          mvn clean install -X
          mvn compiler:compile -X
          

          并使用 id 或目标或插件名称进行搜索 这也可能对其他插件有所帮助。 Eclipse、intelliJ 可能不会将所有配置都显示为建议。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多