组装后但安装前的后处理jar(以获得幂等构建)

Tho*_*sen 13 java build-process maven

我们使用Jenkins使用md5指纹识别工件以及自上次构建以来工件是否已更改.不幸的是,Maven构建总是生成二进制不同的工件.

因此,我正在研究使Maven为同一组输入文件生成相同的jar工件,无论它们在何时何地构建,这些都意味着必须对jar文件中的条目进行排序 - 不仅在索引中,但按顺序将它们写入jar文件.

在检查了使用maven-assembly-plugin的maven-jar-plugin之后,我得出的结论是,在一次写入所有文件之前,它们不会收集所有要写入内存的文件,而是一次写一个.这意味着对生成的jar进行后处理而不是更改当前行为可能会更好,因此我当时可以对条目进行排序,将时间戳等归零等.

我不熟悉编写Maven插件,所以我的问题是,我应该如何编写一个插件,Maven知道如何判断工件jar的位置以及我如何将其挂钩到我的pom.xml中?

(起初我需要这个用于jar文件,但war文件也会很好).

Jig*_*shi 0

创建maven插件项目

mvn archetype:generate \
  -DgroupId=sample.plugin \
  -DartifactId=hello-maven-plugin \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DarchetypeArtifactId=maven-archetype-plugin
Run Code Online (Sandbox Code Playgroud)

调用此命令,它将生成一个骨架项目,其中包含一个名为MyMojo.java

在方法中编写您的内容execute(),然后通过以下方式将该插件安装到您的存储库中mvn clean install

然后将其执行附加到您的项目中pom.xml

 <build>
    <plugins>
      <plugin>
        <groupId>sample.plugin</groupId>
        <artifactId>hello-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>sayhi</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
Run Code Online (Sandbox Code Playgroud)

访问 Mojo 内的项目属性

    /**
     * The Maven project.
     *
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject        project; 
Run Code Online (Sandbox Code Playgroud)

进而

project.getProperties("build.directory") 
Run Code Online (Sandbox Code Playgroud)

读取其他属性来确定您的 jar 文件已打包


  • 这个答案只解决了问题的简单部分(如何编写 Maven 插件),而不是有趣的部分(如何编写执行 X 的插件)。 (2认同)