1

我正在尝试从多项目 Maven 项目中创建一个可执行的 jar。这是我的项目结构,然后是我尝试使用 maven 程序集插件进行的操作。会感谢很多人可以向我暗示解决方案(在我看来,这似乎是最常见的基础,但我在其他讨论链中找不到)。谢谢!

我的结构是(简化的):

我的应用程序

…
  <groupId>myApp</groupId> <artifactId>myApp</artifactId>
  <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging>
  <name>myApp</name>  <url>http://maven.apache.org</url>
…  
  <build>
     <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.6</source>  <target>1.6</target>
      </configuration>
    </plugin>
      </plugins>
  </build>

  <modules>
    <module>../m1</module> <!--  jar-->
    <module>../m2</module> <!--  war -->
    <module>../subAppPomAggregationProject</module>
  </modules>  

  <dependencies>
…
  </dependencies>
</project>

我尝试将以下插件添加到 myApp pom 文件中:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.4</version>
 <configuration>
   <appendAssemblyId>false</appendAssemblyId>
      <archive>
         <manifest>
            <mainClass>com.mypath.Main</mainClass>
         </manifest>
      </archive>
      <descriptorRefs>
    <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
 </configuration>
 <executions>
    <execution>
       <id>make-assembly</id>
       <phase>package</phase>
       <goals>
           <goal>single</goal>
       </goals>
    </execution>
 </executions>
</plugin>

当然,它并没有为 MyApp 创建一个 jar,但它确实在每个模块 (!) 中创建了一个看起来像聚合 jar 的东西,尽管并不是真正具有所有依赖项。

我还尝试使用 MyApp 的模块或依赖项创建另一个超级项目(jar)——也没有工作。我是否应该在 uber-jar 中列出导入到 MyApp 的所有模块(以及导入到 subAppPomAggregationProject 中的模块)?没有尝试过,但如果是这样 - 那么 pom 聚合器的目的是什么,为什么要使用两阶段编译/聚合方法?

我无法尝试 maven-shade-plugin(不确定它是否有帮助),因为它需要 maven 3 而我目前正在使用 2.2.1(不想在我接近里程碑之前升级和动摇……)。

4

2 回答 2

0

如果有阴影插件,您可以使用旧版本。版本 1.7.1 是适用于 Maven 2.x 的最后一个 shade 版本,它将用于创建可执行的 jar 文件......语法应该几乎相同,主要版本号的切换是指示切换到 Maven 3 作为要求。

于 2013-06-01T08:33:04.937 回答
0

在这种环境中工作的解决方案是分层聚合。因此,首先通过创建说 subAppPomAggregationProject.aggregate maven 项目为 subAppPomAggregationProject 创建一个 jar,并在其 pom 中将所有 subAppPomAggregationProject 模块指定为依赖项,并添加 maven-assembly 插件:

<build>
   <plugins>
      <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.4</version>
         <configuration>
             <appendAssemblyId>false</appendAssemblyId>
             <descriptors>
                <descriptor>src/assembly/bin.xml</descriptor>
             </descriptors>
             <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
             </descriptorRefs>
         </configuration>
         <executions>
           <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                 <goal>single</goal>
              </goals>
           </execution>
         </executions>
      </plugin>
    </plugins>
</build>]

然后在应用程序级别执行相同操作 - 创建的 subAppPomAggregationProject 聚合 jar 是模块之一!

因为在每个级别上,依赖项之间的冲突都得到了解决,所以没有一个依赖项在下一个级别的聚合中造成冲突(因为它们已经在它们的单个 jar 中相对出现......或者类似的东西:-))。

于 2013-10-22T08:14:37.127 回答