将库及其所有依赖项打包到一个文件夹,但将其他依赖项打包在单独的文件夹中

时间:2019-02-06 15:35:45

标签: java maven dependencies zip maven-assembly-plugin

我有maven项目。我使用maven-assembly-plugin创建包含所有模块依赖项的zip文件。 需要创建具有以下结构的zip:

/my-libs
/other-libs

对于my-libs,需要打包my-lib依赖关系及其所有​​传递依赖关系中的依赖关系。 要other-libs需要打包当前Maven模块中的所有 other 依赖项。

基本上我需要有条件地选择目标文件夹:

if (dependency in transitive-dependencies(my-lib))
   copy to /my-libs
else
   copy to /other-libs

是否可以使用maven-assembly-plugin?有其他替代的maven插件吗?

4 个答案:

答案 0 :(得分:1)

您需要在程序集XML文件中定义两个dependencySet

<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">
    ...                                                                                                                        
    <dependencySets>                                                                                                                         
        <dependencySet>                                                                                                                      
            <useProjectArtifact>false</useProjectArtifact>                                                                                   
            <useTransitiveFiltering>false</useTransitiveFiltering>                                                                            
            <includes>                                                                                                                       
                <include>com.example:dependency1:jar</include>                                                                       
                <include>com.example:dependency2:jar</include>                                                                       
                ...
            </includes>                                                                                                                      
            <outputDirectory>/my-libs</outputDirectory>                                                                                             
        </dependencySet>                                                                                                                     
        <dependencySet>                                                                                                                      
            <useProjectArtifact>false</useProjectArtifact>                                                                                   
            <useTransitiveFiltering>false</useTransitiveFiltering>                                                                            
            <includes>                                                                                                                       
                <include>com.example:other1:jar</include>                                                                       
                <include>com.example:other2:jar</include>                                                                       
                ...
            </includes>                                                                                                                      
            <outputDirectory>/other-libs</outputDirectory>                                                                                             
        </dependencySet>                                                                                                                     
    </dependencySets>         
    ...                                                                                                               
</assembly>   

文档:

assembly generated

http://maven.apache.org/plugins/maven-assembly-plugin/usage.html

答案 1 :(得分:0)

您可以尝试maven dependency plugin

执行1-复制pom中提到的所有依赖项。

执行2-复制所有依赖项以及传递性依赖项。

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.1.1</version>
        <executions>
          <execution>
            <id>copy-project-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/project-dependency</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
              <excludeTransitive>true</excludeTransitive>
            </configuration>
          </execution>
          <execution>
            <id>copy-project-dependencies-all</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/project-dependency-all</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>

答案 2 :(得分:0)

我给你的印象是你开错了路。您说只有某些程序在类路径上需要other-libs,而其他程序则不需要。因此,这些似乎不是项目的“真正”依赖项,最多是可选的依赖项。

我建议使用my-lib项目创建具有所有依赖项的my-lib的程序集zip。可以在不需要otherlibs的所有情况下使用。

另一方面,您可以从原始项目中创建第二个zip,其中包含所有库。这样,您就可以出于两个不同的目的使用两个不同的zip,但是无需在zip中创建目录结构。

答案 3 :(得分:0)

您可以将依赖项分为两个模块:

- ModuleX
  pom.xml (contain my-libs)
- ModuleY
  pom.xml (contain my-libs + other-libs)

然后使用maven-dependency-plugin将可传递依赖项复制到相应的文件夹中。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.parent.basedir}/build/other-lib</outputDirectory>
                        <includeScope>runtime</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

现在,每个模块构建将只包含您需要的jar,没有重复的INSIDE。 (我认为我们可以忽略两个my-libs BETWEEN的重复,因为无论如何您都不会在同一平台上同时使用两者)