Maven: 如何通过命令行更改目标目录的路径?

96

Maven:如何从命令行更改目标目录的路径?

(我希望在某些情况下使用另一个目标目录)


类似的问题 https://dev59.com/_2rWa4cB1Zd3GeqP9VD8 - gavenkoa
3
简单回答:我有一个内置在target/中的IDE,比如Eclipse,我希望能够在命令行中进行构建,而不会让这两个进程互相干扰。 - john sullivan
我发现这个工具的另一个用途是,可以在命令行中构建集成测试,比如src/it/my-integration-test-project/pom.xml,而不必在源代码树中创建target目录。因为这将在包含项目的验证阶段运行集成测试时被复制。 - Mike Samuel
1
这个回答解决了你的问题吗?使用Maven进行树外构建,是否可行? - 030
2个回答

108

你应该使用配置文件。

<profiles>
    <profile>
        <id>otherOutputDir</id>
        <build>
            <directory>yourDirectory</directory>
        </build>
    </profile>
</profiles>

然后使用你的配置文件启动 Maven

mvn compile -PotherOutputDir

如果你真的想从命令行定义你的目录,你可以这样做(绝对不推荐):

<properties>
    <buildDirectory>${project.basedir}/target</buildDirectory>
</properties>

<build>
    <directory>${buildDirectory}</directory>
</build>

然后这样编译:

mvn compile -DbuildDirectory=test

那是因为使用-Dproject.build.directory无法更改目标目录。


1
非常感谢。为什么第二个解决方案不被推荐? - Igor Mukhin
1
@iimuhin,第一种解决方案是使用Maven配置提供的可能性的正确用法,第二种解决方案更像是一个技巧来使其工作。如果选项-Dproject.build.directory是要使用的,那么它是可用的;这是解决-Dproject.build.directory问题的一种变通方法。此外,使用第一种解决方案,您只需指定路径一次,就不会在启动命令行时在目录名称中出现拼写错误,即使您从IDE中工作,也可以轻松使用此解决方案等。 - Colin Hebert
11
使用配置文件的解决方案存在问题,因为许多更改目标目录的用例是用户特定的(例如希望构建到RAM磁盘),不应写在pom文件中。在用户特定的settings.xml中使用配置文件不能包含构建元素,因此这不是一个选项。 - EricS
我喜欢这个答案,但是也许可以加上通过 settings.xml 激活配置文件的方法,而不仅仅是命令行,以实现更高的可移植性? - Rogue
1
我喜欢你提供的“不推荐的解决方案”,因为它使我能够在其他目录下使用命令行构建,而不会影响指向默认 ${project.basedir}/target 的Eclipse。因此,我可以在Eclipse中编码同时在命令行上构建,而无需等待Eclipse刷新/重建。 - Francois Marot
为什么会说“不推荐”呢?对于构建自动化来说,这是必要的。想象一下,你同时进行生产和调试构建,而你不希望这两个构建相互冲突。 - Alexander Samoylov

31

Colin是正确的,应该使用配置文件。然而,他的答案在配置文件中硬编码了目标目录。一种替代方案是添加一个像这样的配置文件:

    <profile>
        <id>alternateBuildDir</id>
        <activation>
            <property>
                <name>alt.build.dir</name>
            </property>
        </activation>
        <build>
            <directory>${alt.build.dir}</directory>
        </build>
    </profile>

这样做会导致将构建目录更改为alt.build.dir属性所给定的任何内容,该属性可以在POM中、用户设置中或命令行中指定。如果该属性不存在,则编译将在正常的目标目录中进行。


抱歉问一个新手问题,但是为了使这个有利,设置用户设置文件中的属性的适当方式是什么?我从设置参考了解到,设置文件中设置的属性不会在设置文件中插值。 - Michael Scheper
此外,这会带来什么优势?我可能漏掉了什么,但是假设 OP 的“cases”在命令行上指定,那么这是否只会使参数 -Dalt.build.dir=~/mytarget 等同于使用其他属性的 -D - Michael Scheper
啊,我刚意识到这里的每个人都在谈论将配置文件添加到POM中,而不是settings.xml。这会使我的问题和新手一样无用。对此我感到抱歉。 - Michael Scheper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接