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请注意

  1. 这是一个zip档案
  2. “分类器”是资源(如程序集名称)

    资源zip错误src / main / resources

主要项目:

的pom.xml

请注意

  1. 这取决于一个zip档案
  2. 依赖“分类器”是资源(像以前的程序集名称)

     <!-- 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性地指定目标目录。