Maven使用多个src目录编译

有没有一种方法可以在一个maven项目中编译多个java源目录?

188075 次浏览

这对我很有效

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

你可以用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>
使用build-helper-maven-plugin从post和更新src/main/generated。和mvn清洁编译工作在我的../common/src/main/java或on ../common,所以保留了后者。然后是的,确认IntelliJ IDEA(10.5.2版本)级别的编译失败了,就像David Phillips提到的那样。 问题是IDEA没有向项目添加另一个源根。手动添加它解决了这个问题。在项目中编辑任何东西都应该来自maven,而不是直接编辑IDEA的项目选项,这并不好。然而,我将能够忍受它,直到他们直接支持build-helper-maven-plugin,这样它就会自动添加源代码

然后需要另一种变通方法来实现这一工作。由于每次IDEA在pom更改后重新导入maven设置,我新添加的源代码都保留在模块上,但它失去了源文件夹的选择,并且毫无用处。所以对于IDEA -需要设置这些一次:

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

现在把这些文件夹保存在导入状态也不是世界上最好的做法……,但试一试。

为了让它在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>

这可以分两步完成:

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

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

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

我很天真地这样做:

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

在配置中,你可以使用<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可能不会显示所有配置作为建议

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