сборочный плагин для сборки mavenSet с транзитивными зависимостями

1

Я не понимаю, как добавить часть зависимостей в <dependencySet> в сборке

например, я имею зависимость от группы: artifact1 и group: artifact2, которые зависят от группы: artifact0.

Я создаю дескриптор сборки, который должен скопировать группу: artifact2 со всеми зависимостями.

Если зависимость от группы: artifact1 в pom.xml появляется перед зависимостью от группы: 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"
Теги:
maven
maven-3
maven-assembly-plugin

3 ответа

0
Лучший ответ

Существует старая ошибка, открытая для плагина maven-assembly http://jira.codehaus.org/browse/MASSEMBLY-357 с аналогичными примерами.

2

Вам нужно создать несколько dependencySet s, по одному для каждого каталога, который вы хотите создать, а затем использовать includes или excludes чтобы контролировать, какие зависимости идут в какой каталог.

Например, если вы хотите, чтобы spring-aop закончил в каталоге aop и spring-jdbc чтобы попасть в каталог jdbc, вы должны использовать следующие параметры dependencySet:

<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
    Если я создаю множественные наборы dependencySets , я должен описать все переходные зависимости вручную. Я хочу избегать перечисления всех переходных зависимостей каждый раз.
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>

Пусть транзитивные зависимости переходят в другое место:

<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
    после редактирования: и снова, это не работает, пожалуйста, внимательно прочитайте оригинальный пост, я не хочу, чтобы все зависимости были в одном месте, я хочу, чтобы часть зависимостей со всеми переходными зависимостями была в одном месте. Если я изменил <include>org.springframework:spring-jdbc:jar</include> на <exclude>org.springframework:spring-aop:jar</exclude> в исходном сообщении, у меня будет точно такой же результат - некоторые транзитивные зависимости отсутствуют.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню