Maven - 取决于组装的拉链

时间:2012-09-06 10:35:58

标签: maven zip pom.xml maven-assembly-plugin maven-dependency-plugin

我正在尝试将项目B 下拉(并解压缩)由项目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]

我认为这是因为我将项目A 的包装指定为pom而不是zip,但我无法指定项目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>

3 个答案:

答案 0 :(得分:32)

欢迎使用Stack Overflow:)。

你是正确的方式。你真正的问题是使用拉链。

以下配置没问题,对我来说很有用。这是一个旧的(2年前),我不确定是否符合最佳实践。但我知道这有效。

这允许我在项目之间共享一些资源,尤其是单元测试。

Zip项目:

<强>的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. “分类器”是资源(如程序集名称)

      资源        压缩      假               的src / main /资源               

  3. 主要项目:

    <强>的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>
      
        ....
      
      <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>
      

    3. 我希望这很明确,这将有助于你:)

答案 1 :(得分:4)

另一种方法可能是完全放弃压缩,使用标准的Maven生命周期将文件打包为jar文件中的资源,并通过类路径从其他项目访问它们。

除非您有特定的包装要求(包括,排除等),否则无需额外配置:只需将您的资料放入项目的src/main/resources目录。

这种方法具有额外的好处,即在从Eclipse等IDE中调用时可以保持不变。

答案 2 :(得分:0)

如果你想从命令行做这样的事情(例如从脚本而不必编写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>参数指定目标目录。