gpt4 book ai didi

java - pom 中 runOnlyAtExecutionRoot 的用法

转载 作者:行者123 更新时间:2023-11-30 06:56:33 26 4
gpt4 key购买 nike

我有一个多模块 pom,我想为父组件组装一个带有依赖项的 jar。但我不需要为每个模块构建程序集,它们没有程序集描述符。因此,我使用 maven- assembly-plugin 的 runOnlyAtExecutionRoot 参数,但取得了有限的成功:

  1. 如果我通过命令行输入参数,它会起作用:跳过组装模块并生成父项目程序集:mvn 编译程序集:single -DrunOnlyAtExecutionRoot=true
  2. 如果我将参数输入到父 POM 中,它会被忽略:mvn 编译程序集:单个在 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>

第二种方法不起作用,它尝试组装每个模块,但失败,因为“找不到它们的组装描述符”。

在 POM 中指定参数 runOnlyAtExecutionRoot 的正确方法是什么?我也尝试过将其放入“执行”中,但没有成功。

最佳答案

它失败了,因为无法为带有打包 POM 的项目(如父项目)组装描述符引用“jar-with-dependencies”。运行时:

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.

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

解决方案是在父 POM 中使用程序集描述符,它添加打包的 jar 和 jar 模块库(请参阅 copy-dependencies )或 uber jar(请参阅 shade )。

示例:在父项目的 src/main/assemble/下创建描述 rune 件,并在插件配置中的“descriptors”下引用它。我的描述符称为“my-descriptor.xml”

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

描述符将所需的文件添加到分发 zip 文件中。我的描述符获取模块“my-service”的打包 jar,如下所示:

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

关于java - pom 中 runOnlyAtExecutionRoot 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com