用于多项目maven项目的单个可执行jar

时间:2013-05-31 14:16:12

标签: maven dependencies executable-jar

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

我所拥有的结构(简化):

对myApp

…
  <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(不想在我的近里程碑之前升级和摇动事物...... )。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在此类环境中有效的解决方案方法是分层聚合。因此,首先为subAppPomAggregationProject创建一个jar 创建说subAppPomAggregationProject.aggregate maven项目,并在其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是其中一个模块!

因为在每个级别上解析了依赖关系之间的冲突,所以在下一级向上聚合中没有任何依赖关系会产生冲突 (因为他们已经在他们的单个罐子中看起来相对......或者沿着这些线条出现的东西: - ))。