Maven使用多个src目录编译

时间:2008-11-06 21:50:13

标签: java maven-2

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

10 个答案:

答案 0 :(得分:259)

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

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <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>

答案 1 :(得分:48)

我天真地这样做:

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

答案 2 :(得分:34)

这对我有用

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

答案 3 :(得分:15)

要使它在intelliJ中工作,您还可以添加

<generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>

到maven-compiler-plugin

答案 4 :(得分:10)

这也可以通过定义资源标记与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>

答案 5 :(得分:4)

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

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

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

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

答案 8 :(得分:1)

这可以分两步完成:

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

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

答案 9 :(得分:0)

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