2010-09-21 69 views
1

我正在尝试编写一个maven程序集,我不知道如何继续。这是相当复杂的,所以我的例子谷歌并没有真正的帮助。这是我想要做的:复杂的Maven组件

  • 使用launch4j创建安装文件。这部分工作,假设jar文件被正确组装(因此需要一个maven程序集)。
  • 安装程序包含一些依赖关系。这些组装(当前)使用jar-with-dependenciesdescriptorRef。这也适用。
  • 我需要包括一个战争文件(从另一个项目)到大罐子。这是我的困惑。

如何创建一个assembly.xml,将做到既具有相关性(拆包所有jar文件)的罐子,包括从其他项目(不解压)war文件。

任何帮助,将不胜感激。

+0

你想在一个大的Jar文件的一切吗?你看过Uber-Jar吗? – Thomas 2010-09-21 20:11:17

回答

2

如何创建一个assembly.xml,它将执行jar和dependencies(解包所有这些jar文件)并包含另一个项目(未解压缩)的war文件。

假设你有类似下面的一个项目结构(我假设一个简单的结构,因为你没有提到什么都讲究吧):

 
. 
├── pom.xml 
└── src 
    ├── main 
    │   ├── assembly 
    │   │   └── uberjar.xml 
    │   └── java 
    │    └── com 
    │     └── stackoverflow 
    │      └── App.java 
    └── test 
     └── java 
      └── com 
       └── stackoverflow 
        └── AppTest.java 

用下面的pom.xml :

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow</groupId> 
    <artifactId>Q3762049</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <dependencies> 
    <!-- this is the war we want to include in the assembly --> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>my-webapp</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>war</type> 
     <scope>runtime</scope> 
    </dependency> 
    <!-- and below, the other dependencies --> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.4</version> 
    </dependency> 
    ... 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/uberjar.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

正如你所看到的,

  1. 我们不走要在这里使用预定义的描述符jar-with-dependencies,我们将在我们自己的自定义组装描述符中重用它。
  2. 我们在战争中声明了一个依赖项,其范围为runtime,以便我们能够将它包含在程序集中。

而现在,自定义uberjar.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>uberjar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
     <excludes> 
     <exclude>*:war</exclude> 
     </excludes> 
    </dependencySet> 
    <dependencySet> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
     <includes> 
     <include>*:war</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

这是jar-with-dependencies描述符的小的变化,这将创建一个jar:

  • 除了战争的依赖关系,解压后
  • webapp的战争,未解压
  • 来自项目i的类自行宣布

如下图所示:

 
$ mvn clean package 
[INFO] Scanning for projects... 
... 
$ cd target; jar xvf Q3762049-1.0-SNAPSHOT-uberjar.jar 
    created: META-INF/ 
inflated: META-INF/MANIFEST.MF 
    created: org/ 
    created: org/apache/ 
    created: org/apache/commons/ 
    created: org/apache/commons/lang/ 
    created: org/apache/commons/lang/builder/ 
    created: org/apache/commons/lang/enum/ 
    created: org/apache/commons/lang/enums/ 
    created: org/apache/commons/lang/exception/ 
    created: org/apache/commons/lang/math/ 
    created: org/apache/commons/lang/mutable/ 
    created: org/apache/commons/lang/text/ 
    created: org/apache/commons/lang/time/ 
inflated: META-INF/LICENSE.txt 
inflated: META-INF/NOTICE.txt 
inflated: org/apache/commons/lang/ArrayUtils.class 
... 
    created: META-INF/maven/ 
    created: META-INF/maven/commons-lang/ 
    created: META-INF/maven/commons-lang/commons-lang/ 
inflated: META-INF/maven/commons-lang/commons-lang/pom.xml 
inflated: META-INF/maven/commons-lang/commons-lang/pom.properties 
inflated: my-webapp-1.0-SNAPSHOT.war 
    created: com/ 
    created: com/stackoverflow/ 
inflated: com/stackoverflow/App.class