5

我正在将项目从 Ant 迁移到 Maven。我需要交付的最终发行版是一个 zip,其中包含一个可执行 jar 及其所有依赖项。这是我的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。现在第一种和第二种方法 - 从程序集文件中 - 被注释掉了,但是,我已经使用了这两种方法,但它们似乎都不起作用。

任何帮助将不胜感激!

埃里克

4

2 回答 2

9

要使其正常工作,您需要拆分<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创建程序集。

还有两件事需要考虑:

  • 您应该使用验证阶段来构建您的程序集,因为 jar-with-dependencies 描述符包括项目工件本身。在打包阶段,项目工件将无法打包
  • jar-with-dependencies 描述符创建具有所有依赖项的 JAR 文件的能力非常有限。您应该改用maven-shade-plugin
于 2012-07-17T19:48:13.583 回答
1

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

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

于 2012-07-17T17:39:10.570 回答