【问题标题】:maven assembly plugin dependencySet with transitive dependencies具有传递依赖项的 Maven 程序集插件依赖项集
【发布时间】:2014-04-25 16:47:06
【问题描述】:

我不明白如何在程序集中向<dependencySet> 添加部分依赖项

例如,我依赖于 group:artifact1 和 group:artifact2,它们都依赖于 group:artifact0。

我创建了应该复制 group:artifact2 和所有依赖项的程序集描述符。

如果 pom.xml 中对 group:artifact1 的依赖出现在对 group:artifact2 的依赖之前,则我在目标目录中只有 group:artifact2,但是如果我更改依赖项的顺序,那么我在目标目录中就有两个工件。

结果我希望有两个目录具有不同的库集。

这里是一个简单的例子

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.kudrevatykh.stackoverflow</groupId>                                                                                                                                                        
    <artifactId>assembly-question</artifactId>                                                                                                                                                              
    <version>0.0.1-SNAPSHOT</version>                                                                                                                                                                       
    <properties>                                                                                                                                                                                            
        <spring.version>3.2.3.RELEASE</spring.version>                                                                                                                                                      
    </properties>                                                                                                                                                                                           
    <dependencies>                                                                                                                                                                                          
        <dependency>                                                                                                                                                                                        
            <groupId>org.springframework</groupId>                                                                                                                                                          
            <artifactId>spring-aop</artifactId>                                                                                                                                                             
            <version>${spring.version}</version>                                                                                                                                                            
        </dependency>                                                                                                                                                                                       
        <dependency>                                                                                                                                                                                        
            <groupId>org.springframework</groupId>                                                                                                                                                          
            <artifactId>spring-jdbc</artifactId>                                                                                                                                                            
            <version>${spring.version}</version>                                                                                                                                                            
        </dependency>                                                                                                                                                                                       
    </dependencies>                                                                                                                                                                                         
    <build>                                                                                                                                                                                                 
        <plugins>                                                                                                                                                                                           
            <plugin>                                                                                                                                                                                        
                <artifactId>maven-assembly-plugin</artifactId>                                                                                                                                              
                <version>2.4</version>                                                                                                                                                                      
                <executions>                                                                                                                                                                                
                    <execution>                                                                                                                                                                             
                        <id>install</id>                                                                                                                                                                    
                        <phase>package</phase>                                                                                                                                                              
                        <goals>                                                                                                                                                                             
                            <goal>single</goal>                                                                                                                                                             
                        </goals>                                                                                                                                                                            
                        <configuration>                                                                                                                                                                     
                            <descriptor>install.xml</descriptor>                                                                                                                                            
                        </configuration>                                                                                                                                                                    
                    </execution>                                                                                                                                                                            
                </executions>                                                                                                                                                                               
            </plugin>                                                                                                                                                                                       
        </plugins>                                                                                                                                                                                          
    </build>                                                                                                                                                                                                
</project>                                                                                                                                                                                                  

安装.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>install</id>                                                                                                                         
    <includeBaseDirectory>false</includeBaseDirectory>                                                                                       
    <formats>                                                                                                                                
        <format>dir</format>                                                                                                                 
    </formats>                                                                                                                               
    <dependencySets>                                                                                                                         
        <dependencySet>                                                                                                                      
            <useProjectArtifact>false</useProjectArtifact>                                                                                   
            <includes>                                                                                                                       
                <include>org.springframework:spring-jdbc:jar</include>                                                                       
            </includes>                                                                                                                      
            <useTransitiveFiltering>true</useTransitiveFiltering>                                                                            
            <outputDirectory>/</outputDirectory>                                                                                             
        </dependencySet>                                                                                                                     
    </dependencySets>                                                                                                                        
</assembly>                                                                                                                                  

mvn --version 输出

Apache Maven 3.0.4 (r1232337; 2012-01-17 12:44:56+0400)
Maven home: C:\Users\akudrevatykh\bin\apache-maven-3.0.4
Java version: 1.7.0_11, vendor: Oracle Corporation
Java home: C:\Users\akudrevatykh\bin\jdk1.7.0_11\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"

【问题讨论】:

  • 您能否更详细地描述您想要实现的目标,因为它看起来很奇怪?你为什么要创建dir,这会在你的构建过程中引起警告。
  • dir 只是从我的原始 pom 中复制的,如果我将其更改为 zip 警告消失,但生成的 zip 仍然不包含所有依赖项。
  • 好的。比你知道的要多。

标签: java maven maven-3 maven-assembly-plugin


【解决方案1】:

您需要创建多个dependencySets,一个用于您要创建的每个目录,然后使用includesexcludes 来控制哪些依赖项进入哪个目录。

例如,如果您希望spring-aop 最终位于aop 目录中,而spring-jdbc 最终位于jdbc 目录中,您可以使用以下dependencySets:

<dependencySets>

  <dependencySet>
    <outputDirectory>aop</outputDirectory>
    <useProjectArtifact>false</useProjectArtifact>
    <includes>
      <include>org.springframework:spring-aop:jar</include>
    </includes>        
  </dependencySet>

  <dependencySet>
    <outputDirectory>jdbc</outputDirectory>
    <useProjectArtifact>false</useProjectArtifact>
    <includes>
      <include>org.springframework:spring-jdbc:jar</include>
    </includes>
  </dependencySet>

</dependencySets>

您需要尝试确保引入正确的传递依赖关系,可能通过添加额外的includes,但您明白了要点。

【讨论】:

  • 如果我创建了多个 dependencySets's,我应该手动描述所有传递依赖项。我想避免每次都列出所有传递依赖项。
【解决方案2】:

您应该在 pom 文件中将您希望在程序集中具有的依赖项定义为依赖项。这将确保构建顺序由 Maven 自动确定,并且始终相同。 此外,您只需要像这样提供以下描述符,它将所有依赖项打包到一个 zip 文件中:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

  <id>dist-assembly</id>

  <formats>
      <format>zip</format>
  </formats>

  <includeBaseDirectory>false</includeBaseDirectory>

  <dependencySets>
      <dependencySet>
          <outputDirectory>/</outputDirectory>
          <useProjectArtifact>false</useProjectArtifact>
          <unpack>false</unpack>
          <scope>runtime</scope>
      </dependencySet>
  </dependencySets>
</assembly>

让transivite依赖进入不同的位置:

<dependencySets>
  <dependencySet>
      <useProjectArtifact>false</useProjectArtifact>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <outputDirectory>lib</outputDirectory>
      <unpack>false</unpack>
      <excludes>
        <exclude>${project.groupId}:*</exclude>
      </excludes>
  </dependencySet>
</dependencySets>

${project.groupId} 不包括项目工件。您可以根据需要经常重复这部分内容。

【讨论】:

  • 我不希望所有依赖项都转到一个程序集。我希望他们中的一部分去一个地方,一个去另一个地方。但是传递依赖应该被复制两次。
  • 编辑后:再次,它不起作用,请仔细阅读原帖,我不希望 all 依赖于一个地方,我想要 part 的所有具有传递依赖的依赖都放在一个地方。如果我在原始帖子中将&lt;include&gt;org.springframework:spring-jdbc:jar&lt;/include&gt; 更改为&lt;exclude&gt;org.springframework:spring-aop:jar&lt;/exclude&gt;,我会得到完全相同的结果——缺少一些传递依赖。
【解决方案3】:

为 maven-assembly 插件 https://issues.apache.org/jira/browse/MASSEMBLY-357 打开了一个旧错误,并带有类似的示例。

【讨论】:

猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2012-11-16
  • 2011-02-09
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多