12

我有一个多模块项目,想创建一个包含我所有模块的类的单个 jar。在我的父 POM 中,我声明了以下插件:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-assembly-plugin</artifactId>
 <configuration>
  <descriptorRefs>
   <descriptorRef>bin</descriptorRef>
  </descriptorRefs>
 </configuration>
</plugin>

但是,在运行 mvn assembly:assembly 时,仅包含来自父文件夹(空)的源。如何将模块中的源包含到存档中?

4

3 回答 3

8

我认为您正在寻找 Maven Shade 插件:

http://maven.apache.org/plugins/maven-shade-plugin/index.html

将任意数量的依赖项打包成一个 uber 包依赖项。然后可以将其部署到存储库。

于 2010-05-12T19:41:17.017 回答
7

要将所有模块中的类打包到一个 jar 中,我执行了以下操作:

  1. 创建了仅用于将所有其他模块的内容打包到单个 jar 中的附加模块。这通常被称为组装模块。尝试调用与目标 jar 文件相同的此模块。

  2. 在这个新模块的 pom.xml 中,我添加了 maven-assemby-plugin。该插件将所有类打包并将它们放在单个文件中。它使用额外的配置文件(步骤 4。)

<build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>go-framework-assemby</id>
            <phase>package</phase><!-- create assembly in package phase (invoke 'single' goal on assemby plugin)-->
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <descriptors>
                <descriptor>src/main/assemble/framework_bin.xml</descriptor>
              </descriptors>
                  <finalName>framework</finalName>
                  <appendAssemblyId>false</appendAssemblyId>
          </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

3.在这个新模块的 pom.xml 中,我还添加了对所有其他模块的依赖项,包括父 pom。只有依赖项中包含的模块才会被打包到目标 jar 文件中。

<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>fwk-bam</artifactId>
        <version>${project.version}</version>
    </dependency>...

4.最后我在程序集模块中创建了程序集描述符(文件:src/main/assemble/framework_bin.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>all-jar</id>
    <formats>
        <format>jar</format> <!-- the result is a jar file -->
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory> <!-- strip the module prefixes -->

    <dependencySets>
        <dependencySet>
            <unpack>true</unpack> <!-- unpack , then repack the jars -->
            <useTransitiveDependencies>false</useTransitiveDependencies> <!-- do not pull in any transitive dependencies -->
        </dependencySet>
    </dependencySets>
</assembly>
于 2014-02-13T12:18:42.413 回答
0

预定义bin在这里不起作用。您必须使用与预定义bin描述符类似的自定义描述符,但声明moduleSet包含您的项目模块。

于 2010-04-23T14:28:19.533 回答