【问题标题】:How to change globally maven default target directory?如何更改全局maven默认目标目录?
【发布时间】:2018-07-30 04:50:40
【问题描述】:

我已经猜到要更改 maven 构建的输出目标目录。 我看到的更多人问approximately same question,我改写了一下:

我希望为我的所有 m2 项目生成的所有文件都转到 特定的,不同于默认的构建目录。例如,如果我 有项目 P1 和 P2,默认构建目录是 P1/target 和 P2/目标。我想把它改成 P1/target 和 P2/target/ 甚至更好 - temp/P1/target 和 /temp/P2/target

我不想修改每一个 pom.xml。我想把这个作为 一个全局的、我的环境特定的设置。

看起来有几个 maven 插件基于它们的构建目录路径 在“project.build.directory”上,所以我尝试了“m2 - Dproject.build.directory=/temp/target package" 但这没有效果。

有没有人知道任何可行的方法来实现这一点 - 无论是通过 settings.xml 或通过 -D 或其他一些全局方法?

【问题讨论】:

  • 我找到了 -D 选项的解决方案,stackoverflow.com/questions/22741072/… 但全局设置对我来说似乎好多了。
  • Maven 提倡“约定优于配置”。约定说它将是target/,相对于pom.xml。你可以与之抗争,但你只会不止一次地将头撞到墙上。此外,新人将加入您的项目(熟悉 Maven),他们会对这个不同寻常的项目感到困惑。问问自己(或告诉我们)您真正想要实现的目标是什么,而不是您(看起来像)您的品味告诉您事情应该放在与默认目录不同的目录中?
  • 目标非常非常简单。编译输出占用了宝贵的空间,开发完成后我不需要所有这些类。如果您的开发文件夹中有很多项目,只需查看 /target 文件夹中的空间......是的,我可以清理它。但我很懒……其他开发人员不会看到我的目标配置策略,除非我在我的 pom.xml 中这样做。我希望我的目标现在很明确。
  • 所以我想通过本地配置更改约定,以不干扰其他可能的项目用户并期望 cmets 做到这一点。
  • 那么使用符号链接不是更好吗?

标签: java maven settings pom.xml target


【解决方案1】:

如果您找到了-D 解决方案,那么很容易将其设为全球性。 只需使用 MAVEN_OPTS 环境变量。 Maven 会选择它并将其应用到每个构建中。

在 Windows 上(或使用 UI 设置)

set MAVEN_OPTS=-DsomeSystemProp=value

或在 Linux 上

export MAVEN_OPTS=-DsomeSystemProp=value

来源:https://maven.apache.org/configure.html

注意 1:.m2 目录中的 .mvn 目录也是一个选项,但我从未在用户级别使用过。

注意 2: 约定优于配置的东西,人们往往会忘记配置部分。我已经看到硬编码的target 目录作为插件和pom.xml 文件中的输出目录。请注意这一点,如果某些行为很有趣,请尝试使用标准输出目录进行构建。

【讨论】:

    【解决方案2】:

    在一个旧项目中,我们使用 ramdisk 来加快构建速度。

    我必须将 M2_RAMDISK 环境变量设置到我的 ramdisk 中,其余的都已处理完毕。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>poc</groupId>
        <artifactId>ramdisk</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <build>
            <directory>${override.project.build.directory}</directory>
        </build>
        <properties>
            <override.project.build.directory>target</override.project.build.directory>
        </properties>
        <profiles>
            <profile>
                <id>ramdisk</id>
                <activation>
                    <property>
                        <name>env.M2_RAMDISK</name>
                    </property>
                </activation>
                <properties>
                    <override.project.build.directory>${env.M2_RAMDISK}/${project.groupId}/${project.artifactId}/${project.version}</override.project.build.directory>
                </properties>
            </profile>
        </profiles>
    </project>
    

    覆盖构建的输出目录是有风险的业务,因为某些工具只使用target 目录而不是属性值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2023-03-27
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多