Maven编译多个src目录


194

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

Answers:


278

您可以使用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>

2
这种方法的唯一问题是最终工件也包括java源文件(.java文件)。有没有一种方法可以排除源文件并仅包含.class文件?
saravana_pc 2012年

17
只是给其他人(例如我)的便条,plugin元素/project/build/plugins/project/build/pluginManagement/plugins
而不

3
如果您使用的是eclipse,则可能m2e connector for build-helper-maven-plugin要从eclipse市场安装,以消除pom.xml中的错误
死于

1
如果您收到警告,例如'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missing需要在<plugin>标签中添加<version>1.12</version>
Alphaaa

4
因此,最好的方法是在2017年创建XML意大利面。没有人看到这个问题吗?
汤姆(Tom),

55

我天真地这样做:

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

2
为我工作:) Eclipse似乎并不喜欢它。似乎认为“ src / main / java,src / interfaces”是单个src,因此将其标记为(丢失)。
乔尔(Joel)2013年

1
对我而言,这导致Maven 3.2.2找不到任何来源。
user149408

40

这对我有用

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

18
恕我直言,这不是一个好主意,因为几个插件假定sourceDirectory-可能是附加插件sources-作为源文件的根。在您的解决方案中,maven-compiler-plugin是唯一了解这些实际根源的插件。
Laurent Pireyn 2011年

3
@Laurent你是对的。几年前这是个好主意,但现在有很多更好的选择。上面列出的build-helper是我的首选。
萨尔

5
这不会将其添加到项目模型中,因此在IDE中将无法正常工作。
大卫·菲利普斯

+1 @sal就像WAR项目依赖项一样具有魅力。
ATorras 2011年

1
如果我要包括一个外部源目录(包含我在maven项目中使用的Java类),则此方法不起作用。如果我的外部源位于Eclipse工作区之外怎么办?我能做什么?
Aerox

16

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

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

Maven编译器插件


还要补充一点,这也可以在Eclipse中使用,也可以将生成的源添加为项目配置中的源位置。
亚当·霍克斯

2
不过,该路径似乎是由注释处理器生成的源。即使可行,某些插件也可能以不同的方式处理此路径。例如,我希望运行“ clean”时可以删除此目录。
kapex

2
你把它放在哪里?
Pavel Niedoba '18

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>

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

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>

2

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

然后需要另一个解决方法来使此工作正常进行。自从每次pom更改之后IDEA每次重新导入maven设置后,我都会将新添加的源保存在模块中,但是丢失了它的“源文件夹”选择并且没有用。因此,对于IDEA-需要设置一次:

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

现在,将这些文件夹保留在导入上也不是世界上的最佳做法,但是,请尝试一下。


这两个选项都不能与我使用的IntelliJ Idea 9.0.4一起使用。尚未在最近的Eclipse中尝试过build-helper选项,但是当我尝试使用它和3.4和m2插件时,它不起作用。Maven不喜欢从同一个项目构建的多个源代码树或多个工件,因此,绕过此限制的任何尝试通常都是可怕的。
萨尔

已经使用IntelliJ已有很多年了。而且从来没有切换到日食,所以不能谈论它,然后听到它通常也很好。对于IntelliJ升级,每两年一次的个人许可证价格为$ 100 /年。新的主要版本通常每年一月发布。然后,在上一年的最后2-3个月内,他们将允许您购买旧版本并免费升级到即将推出的版本。现在就在这里,因此现在是10买11的“安全”时机。此外,如果您不需要JSP和其他企业功能,请使用免费的社区版。
arntg 2011年

2

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

1

这可以分两个步骤完成:

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

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


1

在配置中,您可以使用<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版本的编译器插件的所有配置。不同的版本具有不同的配置,可以通过-X在常规mvn命令之后运行代码来找到不同的配置。喜欢

mvn clean install -X
mvn compiler:compile -X

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.