Maven:指定outputDirectory仅用于打包jar?

Bas*_*stl 56 maven-2 maven

如何仅为包装jar指定outputDirectory?

http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html这显示了所有参数,但是如何在命令行或pom.xml中设置它们?

lwe*_*ler 65

在命令行上

-DoutputDirectory=<path>
Run Code Online (Sandbox Code Playgroud)

并在pom.xml中

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.3.1</version>
      <configuration>
        <outputDirectory>/my/path</outputDirectory>
      </configuration>
    </plugin>
  </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

  • 我已经试过了: mvn -DoutputDirectory=/tmp package 没有成功。我怎么能告诉 mvn 这个选项应该被 jar:jar 目标使用? (2认同)
  • 你可以使用系统属性在命令行上指定一些参数,对于其他你必须使用技巧的参数(参见我的回答) (2认同)

Sea*_*oyd 45

参数表达式

关于命令行用法:

参数文档指定将参数初始化为属性的值${project.build.directory}(这是指向目标文件夹的属性)

这是这意味着什么:

对于旨在直接从CLI执行的mojos,它们的参数通常提供通过系统属性而不是<configuration/>POM 中的部分进行配置的方法.这些参数的插件文档将列出表示配置的系统属性的表达式.在上面的mojo中,参数url与表达式相关联 ${query.url},这意味着它的值可以由系统属性指定, query.url如下所示:

mvn myquery:query -Dquery.url=http://maven.apache.org
Run Code Online (Sandbox Code Playgroud)

参考:

配置$ {project.build.directory}

然而,${project.build.directory}是不是一个系统属性,它是一个属性的的项目Build对象.

您不能直接在命令行上设置maven的内部属性,但是您可以通过在pom.xml中添加占位符来实现一些小技巧:

<build>
    <directory>${dir}</directory>
</build>
Run Code Online (Sandbox Code Playgroud)

现在,输出目录通过命令行中的属性设置(使用-Ddir=somedirectory).缺点:现在您必须-Ddir在命令行中使用该参数.

使用配置文件

但是这里也有帮助.只需在配置目录时使用配置文件:

<profiles>
    <profile>
        <id>conf</id>
        <build>
            <directory>${dir}</directory>
        </build>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

现在你可以做到

# everything goes in someOtherDir instead of target
mvn clean install -Pconf -Ddir=someOtherDir
Run Code Online (Sandbox Code Playgroud)

或者说老了

# everything goes in target
mvn clean install
Run Code Online (Sandbox Code Playgroud)

配置Jar插件

现在,如果您只想从命令行更改jar outputDirectory而不重定向目标中的所有内容,我们将修改配置文件以从命令行属性配置插件:

<profiles>
    <profile>
        <id>conf</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.3.1</version>
                    <configuration>
                        <outputDirectory>${dir}</outputDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

用法与上述相同:

# everything goes in someOtherDir instead of target
mvn clean install -Pconf -Ddir=someOtherDir
Run Code Online (Sandbox Code Playgroud)


小智 5

感谢@Sean Patrick Floyd 的出色解释。

我不想创建配置文件并mvn始终通过-Pswitch使用,而是想使用另一种方式来设置属性 ${dir} 的默认值。

只需将${dir}的默认值定义为${project.build.directory}

<properties>
    <dir>${project.build.directory}</dir>
</properties>
Run Code Online (Sandbox Code Playgroud)

和@Sean Patrick Floyd 一样,设置 outputDirectory。

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
            <outputDirectory>${dir}</outputDirectory>
        </configuration>
    </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

现在你可以做

# everything goes in someOtherDir instead of target
mvn clean install -Ddir=someOtherDir
Run Code Online (Sandbox Code Playgroud)

或简单的旧

# everything goes in target
mvn clean install
Run Code Online (Sandbox Code Playgroud)