【问题标题】:maven-assembly plugin - how to create nested assembliesmaven-assembly 插件 - 如何创建嵌套程序集
【发布时间】:2010-12-04 02:42:56
【问题描述】:

我有一个项目,我正在尝试创建一个分发 zip 文件,其中包含(以及其他文件)一个可执行 jar,其中包含我的 java 项目的依赖项。

所以我有点希望它看起来像这样:

-wiki-search-1.0.0-dist.zip
    -wiki-search.bat
    -wiki-search-help.html
    -wiki-search-1.0.0-jar-with-dependencies.jar
        -jar content...

我正在使用程序集插件和预定义的描述符“jar-with-dependencies”来创建我的可执行 jar 文件。

我在我的 pom 中指定了一个单独的程序集插件条目,引用一个自定义描述符来尝试构建可分发的 zip 文件。

所以我的 pom 部分看起来像这样:

<plugin>
 <artifactId>maven-assembly-plugin</artifactId>
 <configuration>
  <descriptorRefs>
   <descriptorRef>jar-with-dependencies</descriptorRef>
  </descriptorRefs>
  <archive>
   <manifest>
    <mainClass>quicksearch.QuickSearchApp</mainClass>
   </manifest>
  </archive>
 </configuration>
 <executions>
  <execution>
   <id>make-assembly</id>
   <phase>package</phase>
   <goals>
    <goal>attached</goal>
   </goals>
  </execution>
 </executions>
</plugin>
<plugin>
 <artifactId>maven-assembly-plugin</artifactId>
 <configuration>
  <descriptors>
   <descriptor>src/main/assembly/dist.xml</descriptor>
  </descriptors>
 </configuration>
 <executions>
  <execution>
   <id>make-assembly</id>
   <phase>package</phase>
   <goals>
    <goal>attached</goal>
   </goals>
  </execution>
 </executions>
</plugin>

我的自定义描述符如下所示:

<assembly>
  <id>dist</id>
  <formats>
    <format>tar.gz</format>
    <format>tar.bz2</format>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
      <includes>
        <include>${project.basedir}/target/wiki-search-0.0.1-SNAPSHOT-jar-with-dependencies.jar</include>
      </includes>
      <outputDirectory>.</outputDirectory> 
    </fileSet>
    <fileSet>
      <directory>${project.basedir}/src/main/etc</directory>
      <includes>
        <include>*</include>
      </includes>
     <outputDirectory></outputDirectory> 
    </fileSet>
  </fileSets>
</assembly>

一切正常。 jar-with-dependencies 正在构建中。我的 dist zip 文件正在构建中。但是 dist zip 文件不包含 jar-with-dependencies 文件。

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    您有两种不同的程序集插件配置,并且您希望它们按顺序运行(jar 在 zip 之前),但我认为 Maven 并不暗示解决此问题的任何顺序。我的猜测是 zip 文件是在 JAR 文件之前生成的。

    即使不是这样,我建议您为每个工件创建一个模块。将 JAR 程序集移动到它自己的模块中,并让现在仅 Zip 的模块依赖它。这样 Maven 的依赖顺序解析就可以启动并按顺序构建它们。

    【讨论】:

      【解决方案2】:

      使用您现有的配置,您的组装插件的两个单独配置将被合并,并且配置也将被合并。

      为了实现您的目标,您应该定义具有多个嵌套执行的单个程序集插件配置,然后为其中的每个执行定义配置。然后程序集插件将按顺序执行每个程序集,因此jar-with-dependencies jar 将可用于包含在dist jar 中。另请注意,attached 目标已被弃用,取而代之的是 single 目标。

      还要注意,程序集中的路径是相对于根的,要包含特定文件,您应该使用&lt;files&gt; 元素而不是&lt;filesets&gt; 元素。您还可以在程序集中指定属性以使其不易更改。

      下面重新排列的配置和组装应该可以满足您的需求:

      程序集描述符:

      <assembly>
        <id>dist</id>
        <formats>
          <format>tar.gz</format>
          <format>tar.bz2</format>
          <format>zip</format>
        </formats>
        <files>
          <file>
            <source>
              target/${project.artifactId}-${project.version}-jar-with-dependencies.jar
            </source>
            <outputDirectory>/</outputDirectory>
          </file>
        </files>
        <fileSets>
          <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <includes>
              <include>*</include>
            </includes>
           <outputDirectory>/</outputDirectory> 
          </fileSet>
        </fileSets>
      </assembly>
      

      组装插件:

      <plugin>
       <artifactId>maven-assembly-plugin</artifactId>
       <executions>
        <execution>
         <id>jar-with-dependencies</id>
         <phase>package</phase>
         <goals>
          <goal>single</goal>
         </goals>
         <configuration>
          <descriptorRefs>
           <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
           <manifest>
            <mainClass>quicksearch.QuickSearchApp</mainClass>
           </manifest>
          </archive>
         </configuration>
        </execution>
        <execution>
         <id>dist</id>
         <phase>package</phase>
         <goals>
          <goal>single</goal>
         </goals>
         <configuration>
          <descriptors>
           <descriptor>src/main/assembly/dist.xml</descriptor>
          </descriptors>
         </configuration>
        </execution>
       </executions>
      </plugin>
      

      【讨论】:

      • 传奇。第一次工作。干杯。
      • 谢谢!有没有办法在不将执行附加到默认生命周期的情况下实现这一点?只是省略“阶段”和“目标”元素对我不起作用。
      • 这是一个很好的答案。我一直在寻找这个很长一段时间。
      猜你喜欢
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2014-12-07
      • 2010-11-07
      • 2018-12-20
      相关资源
      最近更新 更多