2009-08-25 319 views
15

我使用程序集插件创建了几个带有一些类的jar。我需要得到的罐子自定义名称:app_business.jarapp_gui.jarcore.jar添加Maven-assembly-plugin:自定义jar文件名

目前我有以下配置:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
    <finalName>app_business</finalName> 
     <descriptors> 
      <descriptor>assembly.xml</descriptor> 
     </descriptors> 
     <attach>true</attach> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

一个的assembly.xml文件:

<assembly> 
     <id>app_business</id> 
     <formats> 
     <format>jar</format> 
     </formats> 
     <baseDirectory>target</baseDirectory> 
     <includeBaseDirectory>false</includeBaseDirectory> 

     <fileSets> 
     <fileSet> 
      <directory>${project.build.outputDirectory}</directory> 
      <outputDirectory></outputDirectory> 
      <includes> 
      <include>org/xyz/**</include> 
      </includes> 
     </fileSet>  
     </fileSets> 
    </assembly> 

这将创建一个文件app_business.jar这是完美的。但我不知道如何创建我的其他文件。选项appendAssemblyId不能帮助我,因为它以AppName-app_business.jar格式创建文件名。我真的需要确切的文件名app_business.jar

任何想法?非常感谢你!

回答

-1

标准的maven插件是用于一般的重复性工作。他们从POM收集所有信息,他们很聪明(从你不需要配置太多的角度来看)。

如果您需要特殊任务,那么我建议使用ant plugin,它允许您在POM中嵌入一段Ant代码。这使您可以运行jar task

+0

我不喜欢混合使用ant和maven任务。无论如何,使用ant任务需要更少的xml配置。 (约20行我的工作) – Synox 2009-08-25 09:01:43

+3

@Synox,你不应该避免antrun插件,它是非常有用的填补在Maven的差距,而无需滚动自己的插件。我只是倾向于发现,当有更多的Mavenic(不管是什么,Maven相当于Pythonic)的方式来做这件事的时候,人们总是喜欢使用它。在这种情况下,我认为程序集插件*应该是更好的选择,但正如你从我的答案中可以看到的那样,似乎仍然存在一些问题,阻止它完全按照OP的要求工作。 – 2009-08-25 13:51:46

+0

使用ant很容易推出maven插件。 – 2010-07-27 19:59:26

38

您可以将配置元素移动到插件声明的执行元素下面。这意味着配置将仅适用于该执行。然后,您可以为其他程序集添加其他程序集插件的执行。

下面是已修改的配置的具有两个执行,每个引用一个不同组件的一个示例:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>make-business-assembly</id> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <finalName>app_business</finalName> 
     <descriptors> 
      <descriptor>src/main/assembly/business-assembly.xml</descriptor> 
     </descriptors> 
     <attach>true</attach> 
     </configuration> 
    </execution> 
    <execution> 
     <id>make-gui-assembly</id> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <finalName>app_gui</finalName> 
     <descriptors> 
      <descriptor>src/main/assembly/gui-assembly.xml</descriptor> 
     </descriptors> 
     <attach>true</attach> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

根据该结构,两个附加的罐子(表观_business.jar和应用程式_gui.jar)将被创建在目标目录中,虽然请注意,如果您安装了该项目,只安装最后一个工件(这当然会成为问题)。

要避免这种情况,您需要将appendAssemblyId属性更改为true。在这种情况下,您可以得到最接近的结果是将finalNames更改为“app”,将ID更改为“gui”和“business”,从而导致app-gui.jar和app-business.jar被打包并且所有工件都被安装。

+0

嘿,谢谢你真的很快回复!它的工作原理是 。正如你所说在控制台上有警告,最后一件神器变成了主神器。 我可以忍受这一点,但我不喜欢控制台上的警告。有没有办法隐藏它们(或配置程序集这样做)? – Synox 2009-08-25 08:43:52

+0

有什么警告? 我的答案的最后一部分讨论了主要构件问题,如果您可以忍受从下划线更改为连字符 – 2009-08-25 09:03:11

+1

警告: [警告]配置选项:'appendAssemblyId'设置为false,'classifier'丢失。 而不是附加程序集文件:... \ app_business.jar,它将成为主项目工件的文件。 注意:如果为此项目提供了多个描述符或描述符格式,则此文件的值将是非确定性的! [警告]替换预先存在的项目主工件文件:... \ app_gui.jar 和程序集文件:.... \ app_gui.jar 我想避免必须从下划线更改为超链节。但如果我无法避免......这个解决方案是相当不错的。 – Synox 2009-08-25 10:45:28