复杂的Maven程序集

时间:2010-09-21 15:50:59

标签: maven-2 maven-assembly-plugin

我正在尝试编写maven程序集,但我不确定如何继续。它相当复杂,所以我谷歌的例子并没有真正帮助。这就是我想要做的事情:

  • 使用launch4j创建安装文件。假设jar文件已正确组装(因此需要maven程序集),此部分有效。
  • 安装程序包含一些依赖项。这些是使用jar-with-dependencies descriptorRef汇编(当前)。这也有效。
  • 我需要将war文件(来自另一个项目)包含到大jar中。这是我的困惑。

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

如何创建一个assembly.xml,它将同时执行带有依赖项的jar(解压缩所有这些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范围声明了依赖关系,以便我们能够将其包含在程序集中。
  3. 现在,自定义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的jar-with-dependencies描述符的一点变体:

    • 除了war,unpacked
    • 之外的依赖项
    • webapp的战争,未解压
    • 项目本身的课程

    如下图所示:

    $ 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