Maven:仅为打包jar指定outputDirectory?

68
4个回答

84

在命令行上

-DoutputDirectory=<path>

并且在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>

2
我已经尝试过了:mvn -DoutputDirectory=/tmp package,但没有成功。我该如何告诉mvn这个选项应该被jar:jar目标使用? - Bastl
1
在命令行中,我认为您无法为单个插件指定它。 - lweller
谢谢。这是我在Stack Overflow上的第一个问题。我对回应时间感到印象深刻 :-) - Bastl
2
你可以使用系统属性在命令行上指定一些参数,对于其他参数,你需要使用一些技巧(请参见我的回答)。 - Sean Patrick Floyd
要构建到项目顶层目录,请使用:<outputDirectory>${project.basedir}</outputDirectory>。 - Steve Swinsburg
没有起作用。。 - Diego Ramos

49

参数表达式

关于命令行用法:

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

这是什么意思:

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

mvn myquery:query -Dquery.url=http://maven.apache.org

参考:

配置 ${project.build.directory}

然而,${project.build.directory} 不是系统属性,它是 ProjectBuild 对象的属性。

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

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

现在,输出目录是通过命令行属性设置的(使用-Ddir=somedirectory)。缺点:现在你总是需要在命令行上使用-Ddir参数。

使用配置文件

但是,在这里也有帮助。只需在想要配置目录时使用一个配置文件:
<profiles>
    <profile>
        <id>conf</id>
        <build>
            <directory>${dir}</directory>
        </build>
    </profile>
</profiles>

现在你可以执行以下操作
# everything goes in someOtherDir instead of target
mvn clean install -Pconf -Ddir=someOtherDir

或者普通的

# everything goes in target
mvn clean install

配置Jar插件

如果你只想从命令行更改jar输出目录而不是重定向所有内容到target,我们将修改配置文件以通过命令行属性配置插件:

<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>

用法与上面相同:

# everything goes in someOtherDir instead of target
mvn clean install -Pconf -Ddir=someOtherDir

8

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

与其创建一个配置文件并总是使用mvn命令的-P开关,我想使用另一种方式来设置属性${dir}的默认值。

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

<properties>
    <dir>${project.build.directory}</dir>
</properties>

和@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>

现在你可以选择执行以下操作:
# everything goes in someOtherDir instead of target
mvn clean install -Ddir=someOtherDir

或者使用传统的方法
# everything goes in target
mvn clean install

0
如果您希望将依赖的JAR文件一并复制到目标文件夹中,请使用maven-dependency-plugin插件。
<project>
  ...
  ...

      <build>
        <plugins>
          <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <phase>install</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>

</project>

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