2016-11-02 38 views
0

我有一個產生三種不同的jar文件的項目:Maven:三個罐子在一個項目中。嘗試使用的組件,但沒有得到的pom.xml和pom.properties嵌入在罐子

  • 的server.jar:這包含所有類和資源。一個標準瓶子
  • Client.jar:這隻包含幾個外部類和沒有資源。
  • ServerSDK.jar:包含所有類,資源,測試類和其他配置文件。

我決定在一個項目中做所有三個罐子,所以任何一個源的變化都會產生一個Jenkins構建並一次部署所有三個罐子。我構建了Server.jar作爲我的標準pom.xml jar。然後,我使用程序集來構建Client.jar和ServerSDK.jar。

我有裝配其他兩個罐子,一切都是我喜歡它的方式的99%,但有一些我想要做的。

  1. 我們在我們的MANIFEST.MF文件中添加了一些條目,以結合Jenkins構建信息和項目信息。
  2. 在標準Maven jar中,pom.xmlpom.properties被嵌入在META-INF目錄中。

我通過maven-assembly-plugin中的<assembly>配置成功完成的第一個。第二個我似乎無法工作,即使我的配置中<addMavenDescriptor>設置爲true

這裏是我的maven-assembly-plugin節我pom.xml

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <archive> 
      <addMavenDescriptor>true</addMavenDescriptor> 
      <manifestSections> 
       <manifestSection> 
        <name>Build-Information</name> 
        <manifestEntries> 
         <Project-Name>${env.JOB_NAME}</Project-Name> 
         <Build-Number>${env.BUILD_NUMBER}</Build-Number> 
         <SVN-Revision>${env.SVN_REVISION}</SVN-Revision> 
        </manifestEntries> 
       </manifestSection> 
       <manifestSection> 
        <name>Module-Information</name> 
        <manifestEntries> 
         <Group-ID>${project.groupId}</Group-ID> 
         <Artifact-ID>${project.artifactId}</Artifact-ID> 
         <Version>${project.version}</Version> 
        </manifestEntries> 
       </manifestSection> 
      </manifestSections> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
      <id>Client</id> 
      <configuration> 
       <finalName>Client</finalName> 
       <appendAssemblyId>true</appendAssemblyId> 
       <descriptors> 
        <descriptor>src/assembly/client.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

<manifestSections>工作得很好,但<addMavenDescriptor>似乎並不奏效,雖然我已經明確地將它設置爲true

據有關maven-archiver-plugin文檔:

無論是創建的存檔將包含這兩個Maven的文件:在META-INF/maven/${groupId}/${artifactId}/pom.xml

  • 一個pom.properties

    • 的POM文件,位於存檔文件,位於檔案中META-INF/maven/${groupId}/${artifactId}/pom.properties

    默認值爲true

  • 根據maven-assembly-plugin頁:

    <archive>
    這是一組到存檔建設者說明,特別是對建築.jar文件。它使您可以爲jar指定一個Manifest文件,以及其他選項。見Maven Archiver參考

    有沒有簡單的東西我在這裏失蹤?

    +0

    嗯,你的配置乍一看看起來是正確的。我會試着去複製一些東西。請注意,不是讓一個項目構建3個JAR,而是將其分解爲多模塊Maven項目的3個模塊。這樣,當任何模塊發生變化時,您仍然需要在Jenkins中構建和部署整個事物,並且這裏推薦使用Maven方法。然後您可以添加第四個模塊進行最終裝配。 – Tunaki

    +0

    我一直認爲模塊編譯自己的類文件 - 就像耳朵或戰爭。在這裏,所有三個罐子共享相同的類文件。其中兩個使用它們全部,一個使用子集。我將不得不再次閱讀模塊,看看這是如何完成的。 –

    回答

    0

    Maven Assembly Plugin實際上忽略了addMavenDescriptor參數,並且永遠不會在生成的程序集中包含Maven描述符。這可以看出in the source code:只有META-INF/MANIFEST.MF文件可能被添加到JAR存檔中。

    我無法找到有關此問題的現有JIRA問題,因此我繼續創建MASSEMBLY-835來跟蹤此問題。


    一個變通現在將自己添加文件在裝配描述:

    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> 
        <id>client</id> 
        <formats> 
        <format>jar</format> 
        </formats> 
        <includeBaseDirectory>false</includeBaseDirectory> 
        <files> 
        <file> 
         <source>pom.xml</source> 
         <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory> 
        </file> 
        <file> 
         <source>${project.build.directory}/maven-archiver/pom.properties</source> 
         <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory> 
        </file> 
        </files> 
        <!-- rest of your configuration --> 
    </assembly> 
    

    這增加了<files>配置,增加了pom.xml和產生pom.properties到目標目錄。

    請注意,pom.properties由默認包目標into the target/maven-archiver directory期間的Maven Archiver組件生成;因此,爲了使它在組裝時出現,Assembly插件必須綁定到階段package(或生命週期中的更晚階段),並且當前的Maven項目需要打包JAR/WAR/EAR/EJB/RAR ...但不包含不打包歸檔的POM。 Maven項目的主要工件也需要構建(如果跳過JAR項目的主JAR生成,則不會生成pom.properties)。

    這在絕大多數情況下都有效。但是如果你想要一個防彈解決方案,你可以自己創建文件。在項目中創建具有以下內容的pom.properties的地方(例如,基本目錄):

    #Generated by Apache Maven ${maven.version} 
    version=${project.version} 
    groupId=${project.groupId} 
    artifactId=${project.artifactId} 
    

    ,並在之前的裝配描述符,有代替:

    <file> 
        <source>pom.properties</source> 
        <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory> 
        <filtered>true</filtered> 
    </file> 
    

    這將正確替換裏面的佔位符這是創建的,並且模仿Maven Archiver會做的事情。

    +0

    謝謝。我懷疑可能是這種情況,但不是真正的Java開發人員,我不會100%確定地閱讀代碼。我想問問StackOverflow會確認它是一個錯誤,或者(更可能)我不知道我在做什麼。我仍然在玩這個。我意識到爲了指定這兩個其他的jar,你現在需要一個''(這也解釋了爲什麼如果我沒有''設置,Maven會拋出一個合適的答案,謝謝 –

    +0

    @DavidW。在這種情況下,這是一個錯誤:)。我將研究解決它,這可能會包含在插件的下一個3.0.0版本中。 – Tunaki

    相關問題