如何使用maven-assembly-plugin定义执行顺序

时间:2012-07-17 17:12:20

标签: maven maven-assembly-plugin

我正在努力将项目从Ant迁移到Maven。我需要提供的最终发行版是一个包含可执行jar的zip,其中包含所有依赖性。这是我的pom的一部分:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2-beta-4</version>
                <configuration>
                    <finalName>ProjectDistribution</finalName>
                    <appendAssemblyId>false</appendAssemblyId>              
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>                            
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>fullQualifiedNameToMainClass</mainClass>
                            <addClasspath>true</addClasspath>                               
                        </manifest>
                    </archive>
                    <descriptors>
                        <descriptor>${project.basedir}/src/main/assembly/dep.xml</descriptor>
                    </descriptors>                      
                </configuration>
                <executions>
                    <execution>
                        <id>jar-with-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>dist</id>
                        <phase>assembly</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>                        
                </executions>                                       
            </plugin>

这是汇编文件:

<assembly>
<id>dist</id>
<formats>
    <format>zip</format>
</formats> 
<!-- 1st approach-->
<!--files>
    <file>
        <source>
            /target/ProjectDistribution.jar
        </source>
        <outputDirectory>/</outputDirectory>
    </file>
</files-->
<fileSets>
            <!-- 2nd approach-->        
    <!--fileSet>
        <directory>/target</directory>
        <outputDirectory></outputDirectory>
        <includes>      
            <include>*.jar</include>
        </includes>
    </fileSet-->
    <fileSet>
        <directory>/HelpFiles</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <include>*.*</include>
        </includes>
    </fileSet>
</fileSets>

我运行1.- mvn compile,2.- mvn package和3.- mvn assembly:single

我正在处理的问题是

它确实生成了包含所有依赖项的jar,它确实生成了zip,但它不包含zip中的jar。我几乎需要弄清楚一种方法,让程序集首先生成jar并等到它被创建(因为它的大小是5 MB),然后创建zip。现在,第一个和第二个方法 - 来自汇编文件 - 被注释掉了,但是,我已经使用过它们,但它们似乎都不起作用。

任何帮助将不胜感激!

埃里克

2 个答案:

答案 0 :(得分:8)

要实现这一点,您需要拆分<configuration>并将其放入两个插件执行中:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.2-beta-4</version>
      <executions>
        <execution>
          <id>jar-with-dependencies</id>
          <phase>verify</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <finalName>ProjectDistribution</finalName>
            <appendAssemblyId>false</appendAssemblyId>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
              <manifest>
                <mainClass>fullQualifiedNameToMainClass</mainClass>
                <addClasspath>true</addClasspath>
              </manifest>
            </archive>
          </configuration>
        </execution>
        <execution>
          <id>dist</id>
          <phase>verify</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <descriptors>
              <descriptor>${project.basedir}/src/main/assembly/dep.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

第一次执行将创建jar文件。第二次执行将采用该JAR文件和  将其与其他文件一起放入ZIP文件中。使用此配置,您只需执行mvn verifymvn install即可创建程序集。

还有两件事需要考虑:

  • 您应该使用 verify 阶段来构建程序集,因为jar-with-dependencies描述符包含项目工件本身。在打包阶段,项目工件将无法进行打包
  • jar-with-dependencies描述符具有非常有限的功能来创建具有所有依赖项的JAR文件。您应该使用maven-shade-plugin代替。

答案 1 :(得分:1)

您正在将预定义的jar-with-dependencies与自定义zip描述符混合。你通常会想要其中一个 - 而不是两个。

看起来你想要一个包含项目工件及其依赖项的zip。为此,您无需创建jar-with-dependencies。但是,如果您确实需要一个包含所有依赖项的可执行jar,则不清楚为什么需要再次压缩它。