2011-06-06 117 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>