【问题标题】:Set a global custom build directory in Maven在 Maven 中设置全局自定义构建目录
【发布时间】:2017-03-06 01:31:11
【问题描述】:

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

我创建了~/.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] 

【问题讨论】:

    标签: maven


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我知道共享目标是个坏主意,我的 sn-p 只是 POC。我的意图是在 ramdisk 上为每个工件创建目标目录(项目目录之外)
    • @mm1 你可以做的是在每个 POM 中定义一个自定义 Maven 属性并在命令行上覆盖它,like shown here。不过,您仍然需要修改 POM。
    • 我知道这个解决方案,但我正在寻找不接触项目 POM 的东西。
    • @mm1 我明白,但这不可能,至少在目前的情况下是不可能的。
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2020-08-31
    • 2012-02-05
    相关资源
    最近更新 更多