在Maven中设置全局自定义构建目录

时间:2016-10-24 10:00:57

标签: maven

我正在尝试在全局级别设置自定义输出目录,而不会弄乱每个项目的pom。

我创建了~/.m2/settings.xml

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">

 <profiles>
   <profile>
     <id>test-target</id>
     <activation>
       <activeByDefault>true</activeByDefault>
     </activation>
     <build>
      <directory>/tmp/test</directory>
     </build>
   </profile>

 </profiles>
 </settings>

但运行mvn clean install

时出错
[WARNING] 
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unrecognised tag: 'build' (position: START_TAG seen ...</activation>\r\n     <build>... @16:13)  @ /home/guest/.m2/settings.xml, line 16, column 13
[WARNING] 

1 个答案:

答案 0 :(得分:2)

你不能这样做,这是预期的行为。

在设置文件中,<profile>元素不允许包含项目POM中可以找到的所有元素。来自the Settings Reference

  

profile中的settings.xml元素是pom.xml profile元素的截断版本。它由activationrepositoriespluginRepositoriesproperties元素组成。 profile元素只包含这四个元素,因为它们关注整个构建系统(这是settings.xml文件的作用),而不是单个项目对象模型设置。

这解释了您的错误:标记<build>在设置中是非法的。此外,由于the default value for the build directory${project.basedir}/target,您需要更改项目基目录(即POM的位置)以使用系统属性覆盖命令行中的目录。

所有这些都是有道理的,不能做到这一点是完全正常的。项目构建目录特定于每个项目:它包含在构建特定项目期间创建的临时文件。如果您可以与多个项目共享此文件夹,您很快就会遇到有关在多模块Maven项目中覆盖彼此的文件的问题。取两个模块module-amodule-b:如果它们共享相同的构建目录,这也意味着它们将共享相同的类目录(my-new-build-directory/classes),并且您将拥有一个包含类的文件夹这两个模块;现在不可能只用它的类创建module-a的正确JAR,它们将如何区分?然后,模块中的一个资源也可能会覆盖另一个模块中的一个资源,因为它们都会在同一个临时文件夹中结束。

这个想法是,由于构建目录与正在构建的项目紧密相关,因此需要将它放在每个项目的特定目录中。默认情况下,Maven将其放置在POM位置的每个项目的文件夹target内。如果你想要覆盖它(并且可能通过与其他项目共享来自己射击),你可以,但是你需要明确地修改项目的POM。