Maven – 取决于组装的邮编
我正在尝试让Project B下拉(并解压缩)由Project A构build的ZIP并将其部署到远程存储库。
ZIP是使用maven-assembly-plugin
创build和连接的,包装types是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>
试图从Project B的pom中使用maven-dependency-plugin
:
<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]
我会假设这是因为我指定项目A的包装为pom
而不是zip
,但是我不能指定项目A作为包装typeszip
因为它会导致:
[ERROR] Unknown packaging: zip @ line 13, column 13
我在这里做错了什么,或者这是不可能的? 我只是想将一些文件捆绑到一个工件中,并允许多个其他项目下载并解压缩以供使用。 打开不同的build议…
我也检查过,以确保组装的拉链确实在联结。
更新与答案
对于其他人的好处,我所缺less的是依赖项的<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>
欢迎来到堆栈溢出:)。
你走对了。 你真正的问题是使用zip。
以下configuration是好的,对我来说很好。 这是一个老的(2年前),我不确定这是否符合最佳实践。 但我知道这是工作。
这使我可以在项目之间共享一些资源,尤其是unit testing。
邮编项目:
的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请注意
- 这是一个zip档案
-
“分类器”是资源(如程序集名称)
资源zip错误src / main / resources
主要项目:
的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> ...
src / test / resources true $ {project.build.directory} / test-resources true
<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文件中的资源,并通过classpath从其他项目访问它们。
除非你有特定的包装要求(包括,排除等),否则不需要额外的configuration:只要把你的东西放在你的项目的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>
参数来select性地指定目标目录。