2014-03-19 70 views
1

我不明白怎麼依賴的部分裝配的Maven Assembly插件dependencySet與傳遞依賴

添加到<dependencySet>例如我有組依賴關係:artifact1和組:artifact2既依賴於組:artifact0。

我創建了應該複製組:artifact2與所有依賴關係的程序集描述符。

如果依賴組:artifact1在pom.xml中出現在對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>                                                 

INSTALL.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" 
+0

你能更詳細地描述你想達到什麼樣的目標,這對我來說看起來很奇怪嗎?你爲什麼要創建'dir',在構建過程中會引發警告。 – khmarbaise

+0

'dir'只是從我的原始pom中複製的,如果我將其更改爲'zip'警告消失,但生成的zip仍然不包含所有依賴關係。 –

+0

好的。比你知道的。 – khmarbaise

回答

2

您需要創建多個dependencySet s,其中一個用於您要創建的每個目錄,然後使用includesexcludes來控制哪些相關性位於哪個目錄中。

例如,如果你想spring-aopaop目錄落得和spring-jdbc落得在jdbc目錄,你可以使用下面的dependencySet S:

<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> 

你需要發揮一下以確保正確的傳遞依賴關係被拉入,也許通過增加額外的include s,但你獲得了要點。

+0

如果我創建multiply'dependencySets',我應該手動描述所有傳遞依賴。我想避免每次列出所有傳遞依賴項。 –

2

您應該在您的程序集中將您喜歡的依賴關係定義爲依賴關係。這將確保建築物的順序由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}排除項目工件。您可以重複此部分,因爲您經常需要將其複製。

+0

我不希望所有依賴關係都轉到一個程序集。我只想讓他們中的一部分去一個地方,一個去另一個地方。但傳遞依賴應該被複制兩次。編輯後的 –

+0

:再次,它不工作,請仔細閱讀原文,我不希望_all_依賴關係到一個地方,我希望與所有傳遞依賴關係的_part_依賴到一個地方。如果我在原始文章中將' org.springframework:spring-jdbc:jar'更改爲' org.springframework:spring-aop:jar'我有完全相同的結果 - 缺少一些傳遞依賴關係。 –