2011-06-06 75 views
1

我们已经创建了一个罐子(Spring项目),我们在又一个春天项目使用Maven包括(战争)Maven的春季罐子包装

如果我们有所需的依赖关系,我们可以用这个没有问题。

如果我想确保jar包含所有的依赖关系并使用它,那么最好的方法是什么?

为了避免必须包含我尝试使用包含文件的maven assembly插件 的依赖关系 - 但这些似乎被忽略,因为它们仍然是消费项目中的依赖项 - 任何建议为什么?

POM细节进行组装插件

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.5</source> 
       <target>1.5</target> 
      </configuration> 
     </plugin> 
     <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2.1</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 

    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> <!-- this is used for inheritance merges --> 
     <phase>package</phase> <!-- bind to the packaging phase --> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

如果您发布的装配插件描述这将是有益的。 – Tarlog 2011-06-06 10:23:01

回答

1

您可以使用maven温斯顿插件创建一个独立的可执行的JAR文件与所有依赖包括战争,罐子等....

添加

<plugins> 
    <plugin> 
    <groupId>net.sf.alchim</groupId> 
    <artifactId>winstone-maven-plugin</artifactId> 
    <version>1.2</version> 
    <executions> 
     <execution> 
     <goals> 
      <goal>embed</goal> 
     </goals> 
     <phase>install</phase> 
     </execution> 
    </executions> 
    <configuration> 
     <filename>${project.parent.build.finalName}.jar</filename> 
    </configuration> 
    </plugin> 
    ... 
</plugins> 

将包含应用程序的所有模块,战争和罐子,以及任何需要的依赖包含在一个可执行的jar包括一个servlet引擎。

这对于为您的Ops团队部署单个可部署捆绑包真的很好。

我会建议不要创建一个包含战争使用的所有依赖项的jar。您可能最终得到类路径中相同类的稍微不同版本的多个副本。某些图书馆有点呃,...,有关这方面的气质(休眠和log4j春天)。

的Maven确实搞清楚哪些依赖采取一个体面的工作,如果事情打破MVN依赖性:树使事情更加清晰。当你创造一个超级罐子时你会失去这个。

如果有足够的理由这样做,我会推荐一个环境,在这个环境中,您可以像完整的J2EE服务器或使用OSGi容器一样严格控制类路径。但是,要小心你所希望的:这些不是没有(铁)手套的小猫。

+0

winstone-maven-plugin:1.2:embed(默认)--- [INFO]仅适用于包装=='war' 我想将其作为jar包装,以便能够将其包含在其他代码中 – 2011-06-06 10:15:30

+0

谢谢彼得。由于我对此比较陌生,因此我认为这将是一种更好的分发共享代码的方式,承担您所说的内容,并确保人们向战争添加依赖项。 – 2011-06-06 10:25:59

+0

我扩展了有关为模块创建用户罐的答案。我会认真地建议远离那里避免在地狱里下降。 Maven和其他构建工具以类路径中没有重复的方式处理依赖性方面做得很好。另一个解决方案是“简单地”部署独立的jar,与WAR分开,并讨论某种RPC,然后可以由其他客户端使用。 – 2011-06-06 10:28:30

0

我用下面的组件配置来创建与所有运行时依赖一个罐子有:

<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>runnable</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <unpack>true</unpack> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
    <fileSets> 
     <fileSet> 
      <directory>${project.build.outputDirectory}</directory> 
      <includes> 
       <include>*.jar</include> 
      </includes> 
     </fileSet> 
    </fileSets> 
</assembly>