由 maven-dependency-plugin 复制的依赖项的 jar-s 未安装到本地存储库



有模块A、B和C。模块A是模块B和C的依赖项。模块A中构建的所有jar-s都将分发到Maven Central中,但只有在模块B和C中的集成测试通过之后。

为了实现上述目标,我决定实现一个多模块项目,其中有一个专门用于分发的模块D。

由于分发模块D有其自己的特定坐标,来自模块A的jar-s将被重命名。

我的想法是将jar-s作为依赖项从模块A复制到模块D的目标目录,并根据模块D的坐标进行重命名。这是模块D pom:

<parent>
<groupId>...</groupId>
<artifactId>parent</artifactId>
<version>0.1.0-SNAPSHOT</version>
</parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<packaging>pom</packaging>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
<destFileName>${project.artifactId}-${project.version}.jar</destFileName>
</artifactItem>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>jar</type>
<classifier>sources</classifier>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
<destFileName>${project.artifactId}-${project.version}-sources.jar</destFileName>
</artifactItem>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>jar</type>
<classifier>javadoc</classifier>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
<destFileName>${project.artifactId}-${project.version}-javadoc.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

jar-s从模块A复制到模块的D目标目录,但在安装阶段完成后,只有模块的D pom在我的本地存储库中更新。在构建日志中也没有关于安装复制的jar-s的记录。

同时,来自模块A的jar-s被成功安装。

我试图将模块D的封装更改为jar,但之后只安装了带有二进制文件的jar,并且没有安装带有源代码和javadoc的jar-s。

目前,找到了以下解决方法:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>${project.build.directory}/${project.artifactId}-${project.version}.jar</file>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
<javadoc>
${project.build.directory}/${project.artifactId}-${project.version}-javadoc.jar
</javadoc>
<sources>
${project.build.directory}/${project.artifactId}-${project.version}-sources.jar
</sources>
</configuration>
</execution>
</executions>
</plugin>

还有其他不那么笨拙的解决方案吗?

谢谢。

该方法过于复杂。

你应该做什么:

  • 构建A
  • 用B和C测试A
  • 部署A

根据您的方法,实现这一目标的可能性不同。例如,您可以使用maven部署插件的属性deployAtEnd

事实证明,仅仅将所需的jar-s复制到目标是不够的,但这些jar-s需要使用构建助手maven插件附加。

因此,这里是父pom(为了与问题细节保持一致,为了清晰起见,有点简化(:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0      http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.internal</groupId>
<artifactId>parent</artifactId>
<version>0.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>D</module>
</modules>
</project>

以下是分布式模块D的pom(也有点简化(:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example.internal</groupId>
<artifactId>parent</artifactId>
<version>0.1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>D</artifactId>
<packaging>pom</packaging>
<properties>
<moduleToDistributeGroupId>com.example.internal</moduleToDistributeGroupId>
<moduleToDistributeArtifactId>A</moduleToDistributeArtifactId>
<sourcesClassifier>sources</sourcesClassifier>
<javadocClassifier>javadoc</javadocClassifier>
<binaryArtifactName>${project.artifactId}-${project.version}.jar</binaryArtifactName>
<sourcesArtifactName>${project.artifactId}-${project.version}-${sourcesClassifier}.jar</sourcesArtifactName>
<javadocArtifactName>${project.artifactId}-${project.version}-${javadocClassifier}.jar</javadocArtifactName>
</properties>
<dependencies>
<dependency>
<groupId>com.example.internal</groupId>
<artifactId>A</artifactId>
</dependency>
<dependency>
<groupId>com.example.internal</groupId>
<artifactId>B</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.example.internal</groupId>
<artifactId>C</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifact>
</artifact>
<artifactItems>
<artifactItem>
<groupId>${moduleToDistributeGroupId}</groupId>
<artifactId>${moduleToDistributeArtifactId}</artifactId>
<version>${project.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
<destFileName>${binaryArtifactName}</destFileName>
</artifactItem>
<artifactItem>
<groupId>${moduleToDistributeGroupId}</groupId>
<artifactId>${moduleToDistributeArtifactId}</artifactId>
<version>${project.version}</version>
<type>jar</type>
<classifier>${sourcesClassifier}</classifier>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
<destFileName>${sourcesArtifactName}</destFileName>
</artifactItem>
<artifactItem>
<groupId>${moduleToDistributeGroupId}</groupId>
<artifactId>${moduleToDistributeArtifactId}</artifactId>
<version>${project.version}</version>
<type>jar</type>
<classifier>${javadocClassifier}</classifier>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
<destFileName>${javadocArtifactName}</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/${binaryArtifactName}</file>
<type>jar</type>
</artifact>
<artifact>
<file>${project.build.directory}/${sourcesArtifactName}</file>
<classifier>${sourcesClassifier}</classifier>
<type>jar</type>
</artifact>
<artifact>
<file>${project.build.directory}/${javadocArtifactName}</file>
<classifier>${javadocClassifier}</classifier>
<type>jar</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
<!--other plugins-->
</plugins>
</build>
</project>

工件被附加后,它们会被所有其他插件自动识别,例如gpg、安装、部署等。

最新更新