ChatGPT解决这个技术问题 Extra ChatGPT

Maven 编译多个 src 目录

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


O
Ondra Žižka

您可以使用 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 的警告,您需要在 <plugin> 中添加标签 <version>1.12</version>
因此,在 2017 年,最好的方法是创建 XML Pasta。没有人认为这有问题吗?
c
comeGetSome

我天真地这样做:

<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 对我来说。
B
Betlista

这对我有用

<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 工作区之外怎么办?我能做些什么?
c
cb4

要使其在 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 标准:<generatedSourcesDirectory>${project.build.directory}/generated-sources/main/java</generatedSourcesDirectory>
G
Gavin S. Yancey

通过定义资源标签,这也适用于 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>

maven.apache.org/pom.html#Resources --> Resources are not (usually) code. They are not compiled
S
SwissCodeMen

这适用于 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>

S
SwissCodeMen

虽然来自 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>

a
arntg

使用帖子中的 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 以便它会自动添加源。

然后需要另一种解决方法来完成这项工作。由于每次在 pom 更改后 IDEA 重新导入 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 和其他企业功能,请使用免费的社区版。
G
Gerold Broser

这可以分两步完成:

对于每个源目录,您应该创建自己的模块。

在所有模块中,您应该指定相同的构建目录:${build.directory}

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


P
Prabhu

在配置中,您可以使用 <compileSourceRoots>

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 可能不会将所有配置都显示为建议。