在pom中使用runOnlyAtExecutionRoot

时间:2017-01-16 17:19:35

标签: java maven maven-assembly-plugin

我有一个多模块pom,我想为父级组装一个jar-with-dependencies。但我不需要为每个模块构建程序集,他们没有事件具有程序集描述符。所以我使用了maven-assembly-plugin的runOnlyAtExecutionRoot参数,但成效有限:

  1. 如果我通过命令行输入参数,它可以工作:跳过组装模块并生成父项目程序集: mvn compile assembly:single -DrunOnlyAtExecutionRoot=true
  2. 我将参数输入到父POM中,它被忽略: mvn compile assembly:single 在pom.xml中:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.orgPOM/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/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>my.company</groupId>
        <artifactId>thisApp</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <name>thisApp Parent Project</name>
    
        <modules>
            <module>my.company.thisApp.main</module>
            <module>my.company.library-1</module>
            <module>my.company.library-1.library-1-1</module>
            <module>my.company.library-1.library-1-2</module>
            <module>my.company.library-2</module>
            <module>my.company.library-3</module>
            <module>my.company.library-3.library-3-1</module>
        </modules>
    
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>3.0.0</version>
                        <configuration>
                            <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
        <dependencies>
            <dependency>
                <groupId>my.company.thisApp</groupId>
                <artifactId>main</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </project>
    
  3. 第二种方式不起作用,它试图组装每个模块并且它失败了,因为没有找到任何组件描述符&#39;对他们来说。

    在POM中指定参数runOnlyAtExecutionRoot的正确方法是什么?我也曾尝试将其置于“执行”状态。没有成功。

1 个答案:

答案 0 :(得分:1)

它失败了,因为描述符引用&#34; jar-with-dependencies&#34;无法为包含POM的项目(如父项目)组装。运行时:

mvn clean package assembly:single

我收到以下错误消息:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:3.0.0:single (default-cli) on project my-parent: Failed to create assembly: Error creating assembly archive jar-with-dependencies: You must set at least one file.

它表示必须至少有一个文件,这意味着至少必须将文件添加到程序集中。由于没有包装的罐子,所以无法完成。

解决方案是在父POM中使用汇编描述符,它添加jar模块的jar包和jar模块(参见shade)或uber jar(参见{{3}})。

示例:在src / main / assembly /下的父项目中创建一个描述符文件,并在&#34; descriptors&#34;下引用它。在插件配置中。我的描述符名为&#34; my-descriptor.xml&#34;

<configuration>
  <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
  <descriptors>
    <descriptor>${project.basedir}/src/main/assembly/my-descriptor.xml</descriptor>
  </descriptors>
</configuration>

描述符将希望的文件添加到分发zip文件中。我的描述符选择了模块的打包jar&#34; my-service&#34;看起来像这样:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
  <id>distribution</id>
  <formats>
    <format>zip</format>
  </formats>

  <files>
    <file>
      <source>my-service/target/my-service-${project.version}.jar</source>
      <outputDirectory>/</outputDirectory>
    </file>
  </files>
</assembly>