2015-01-26 44 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目录中。