2015-01-26 43 views
6

構建maven項目時遇到問題。我需要生成確定性的 jar文件,這些文件必須在不同的版本和版本中二進制一致,以防這些版本之間沒有源代碼更改。爲此,我使用this article作爲指導。如果使用maven-assembly-plugin構建,手動附加主構件

我成功地設計了我的罐子,並且它們符合我的要求。下面是我的配置:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
     <id>step-1-remove-timestamp</id> 
     <phase>prepare-package</phase> 
     <configuration> 
      <target> 
      <touch datetime="01/01/2015 00:10:00 am"> 
       <fileset dir="target/classes"/> 
       <fileset dir="src"/> 
      </touch> 
      </target> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
     <execution> 
     <id>step-3-rename-assembly</id> 
     <phase>package</phase> 
     <configuration> 
      <target> 
      <copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip" 
        tofile="${project.build.directory}/${project.build.finalName}.jar"/> 
      </target> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2.1</version> 
    <configuration> 
     <descriptors> 
     <descriptor>src/main/assembly/zip.xml</descriptor> 
     </descriptors> 
    </configuration> 
    <executions> 
     <execution> 
     <id>step-2-make-assembly</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

在上面的代碼中,我構建和打包的jar爲ZIP,然後將拉鍊複製超預期的罐子神器。
上面的問題是,maven仍然執行maven-jar-plugin,所以手動組裝的罐子被maven-jar-plugin中的一個覆蓋。我不想使用這個罐子,因爲它不符合我的要求。

所以,我已經禁用了maven-jar-plugin執行,通過明確地將其設定爲一個無效的階段運行,如下圖所示:(看到來自other posts here

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
     <id>default-jar</id> 
     <phase>never</phase> 
     <configuration> 
      <finalName>unwanted</finalName> 
      <classifier>unwanted</classifier> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

似乎一切都很好,直到我發現我的主要罐子工件永遠不會安裝在.m2目錄中。爲了解決這個問題,我還添加了maven-helper-plugin讓我手動附加我從彙編器插件產生任何文物:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.9.1</version> 
    <executions> 
     <execution> 
     <id>attach-instrumented-jar</id> 
     <phase>verify</phase> 
     <goals> 
      <goal>attach-artifact</goal> 
     </goals> 
     <configuration> 
      <artifacts> 
      <artifact> 
       <file>${project.build.directory}/${project.build.finalName}.jar</file> 
       <type>jar</type> 
      </artifact> 
      </artifacts> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

這就導致了一個錯誤,我無法解決:

[錯誤]無法執行目標org.codehaus.mojo:build-helper-maven-plugin:1.9.1:在項目my-project上執行attach-artifact(attach-instrumented-jar):執行目標爲org.codehaus的attach-instrumented-jar。 mojo:build-helper-maven-plugin:1.9.1:attach-artifact失敗:對於工件{full-name-of-my-project.jar}:附加的工件必須具有與其相應的主工件不同的ID。 - > [Help 1]

有沒有辦法解決這個問題?我已經檢查過解決方案,並且大多數人推薦使用分類器,但是我想安裝主要的神器,就像maven-jar-plugin一樣。我們正在開發的其他軟件將需要標準的jar依賴,並且我們希望通過不合理地引入分類器來避免複雜化我們的設置。

回答

3

經過一些更多的嘗試和失敗後,我碰巧遇到了一個工作解決方案。 我在這裏發佈的希望是有用的,或者有任何問題指向我,因爲如果這是一種可靠的方法,我並不確定。

因此,錯誤我接收

一個附加的工件必須有不同的ID比其相應的主僞影。

對我意味着我無法手動安裝「再次」主神器。由於該工件不再由maven-jar-plugin生成,所以即使該文件存在(antrun複製任務生成具有相同名稱的jar)也不會安排安裝。

出人意料的是,它需要一些小技巧,讓再次這項工作:

  1. 重新啓用maven-jar-plugin因爲它應該是:

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-jar-plugin</artifactId> 
        <version>2.5</version> 
        <executions> 
        <execution> 
         <id>default-jar</id> 
         <phase>package</phase> 
        </execution> 
        </executions> 
    </plugin> 
    

    這將產生在標準瓶package階段,最重要的是,使得maven知道它將在install階段安裝。

  2. 調整maven-antrun-plugin複製任務到覆蓋已經生成的具有確定性zip的jar。該設置是在我的問題幾乎相同的,所以我只需要添加的差異:

    <plugin> 
        <artifactId>maven-antrun-plugin</artifactId> 
        <version>1.7</version> 
        <executions> 
        <execution>...</execution> 
        <execution> 
         <id>step-3-rename-assembly-and-sources</id> 
         <phase>package</phase> 
         <configuration> 
         <target> 
          <copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip" 
           tofile="${project.build.directory}/${project.build.finalName}.jar" 
           overwrite="true"/> 
         </target> 
         </configuration> 
        </execution> 
         . . . 
        </executions> 
    </plugin> 
    

    現在已經指定overwrite="true"複製操作。最初,複製操作似乎忽略了目標中的文件(如果它們已經存在),並且發生的是在複製發生時maven-jar-plugin已經產生了默認的jar僞影。使用這個選項,maven-antrun-plugin現在覆蓋了前一個確定性瓶子,而後者成爲maven install階段的一個主題。

  3. 刪除從構建輔助-行家-插件的設置,從而使主罐僞像不被複制的第二時間:

 

      <artifact> 
       <file>${project.build.directory}/${project.build.finalName}.jar</file> 
       <type>jar</type> 
      </artifact> 
 

就是這樣,正確的jar安裝在.m2目錄中。