我正在尝试让 Project B 下拉(并解压)由 Project A 构建的 ZIP 并部署到远程存储库。
使用
maven-assembly-plugin
创建并附加 ZIP,包装类型为 pom
:
<artifactId>project-a</artifactId>
<name>ZIP</name>
<description>Used by Project B</description>
<packaging>pom</packaging>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>distribution-package</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/scripts.xml</descriptor>
</descriptors>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
</execution>
</executions>
</plugin>
尝试使用 maven-dependency-plugin
将其从
Project B的 pom 中拉下来:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-scripts</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/staging</outputDirectory>
<stripVersion>true</stripVersion>
<artifactItems>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<overWrite>true</overWrite>
<type>zip</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
失败:
[ERROR] Failed to execute goal on project ...: Could not resolve dependencies for project group:artifact:pom:version: Could not find artifact group:project-a:zip:version in nexus (http://...:8081/nexus/content/groups/public) -> [Help 1]
我认为这是因为我将 Project A 的包装指定为
pom
而不是 zip
,但是我无法将 Project A 指定为包装类型 zip
,因为它会导致:
[ERROR] Unknown packaging: zip @ line 13, column 13
我在这里做错了什么还是这根本不可能? 我只有一堆文件,我想将它们捆绑到一个工件中,并允许多个其他项目下载并解压它们以供使用。接受不同的建议...
我还检查过以确保组装好的拉链确实位于连接中。
已更新答案
为了其他人的利益,我缺少的是依赖项的
<classifier>
必须与程序集的 <id>
相匹配。请注意以下文件中指定 thisistheattachedartifactsclassifier
的位置。
scripts.xml(项目A):
<assembly>
<id>thisistheattachedartifactsclassifier</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>src/main/resources</directory>
...
</fileSet>
</fileSets>
</assembly>
pom.xml(项目B):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-scripts</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/staging</outputDirectory>
<stripVersion>true</stripVersion>
<artifactItems>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<classifier>thisistheattachedartifactsclassifier</classifier>
<overWrite>true</overWrite>
<type>zip</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
欢迎来到 Stack Overflow :)。
你走在正确的道路上。你真正的问题是使用拉链。
以下配置没问题,对我来说效果很好。这是一个旧的(两年前),我不确定它是否符合最佳实践。但我知道这是有效的。
这使我可以在项目之间共享一些资源,尤其是单元测试。
pom.xml
<groupId>com.mycompany</groupId>
<artifactId>cfg_dev</artifactId>
<version>1.1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>cfg-main-resources</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptors>
<descriptor>/src/main/assembly/resources.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
装配描述符: 它将产生这个工件:cfg_dev-1.1.0-resources.zip 请注意
<assembly>
<id>resources</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory></outputDirectory>
</fileSet>
</fileSets>
</assembly>
pom.xml
请注意
这取决于 zip 存档
依赖项“分类器”是资源(如之前的程序集名称)
<!-- Unit test dependency -->
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>cfg_dev</artifactId>
<version>${project.version}</version>
<classifier>resources</classifier>
<type>zip</type>
<scope>test</scope>
</dependency>
....
<build>
<testResources>
<!-- Ressources habituelles -->
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
<!-- Unzipped resources from cfg_dev -->
<testResource>
<directory>${project.build.directory}/test-resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<plugins>
<!-- Unzip shared resources -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-cfg-test-resources</id>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<phase>generate-test-resources</phase>
<configuration>
<outputDirectory>${project.build.directory}/test-resources</outputDirectory>
<includeArtifactIds>cfg_dev</includeArtifactIds>
<includeGroupIds>${project.groupId}</includeGroupIds>
<excludeTransitive>true</excludeTransitive>
<excludeTypes>pom</excludeTypes>
<scope>test</scope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
我希望这很清楚并且对您有帮助:)
另一种方法可能是完全放弃压缩,使用标准 Maven 生命周期将文件作为资源打包在 jar 文件中,并通过类路径从其他项目访问它们。
除非您有特定的打包要求(包括、排除等),否则不需要额外的配置:只需将您的东西放在项目的
src/main/resources
目录中即可。
此方法的另一个好处是,从 IDE(例如 Eclipse)中调用时可以保持不变。
如果您想从命令行执行类似的操作(例如,从脚本执行,而无需编写
pom.xml
文件),请按照以下方法执行此操作...
您可以指定各个属性:
mvn dependency:copy -DgroupId=org.apache.maven -DartifactId=maven-core -Dversion=2.2.1 -Dpackaging=zip -Dclassifier=thisistheattachedartifactsclassifier
或者在一个
artifact
参数中全部指定:
mvn dependency:copy -Dartifact=org.apache.maven:maven-core:2.2.1:zip:thisistheattachedartifactsclassifier
对于后者,重要的是将
classifier
保留在末尾,位于 packaging/type
属性之后。像这样:-Dartifact=groupId:artifactId:version:type:classifier
如果需要,您还可以选择使用
-DoutputDirectory=<directory>
参数指定目标目录。