gpt4 book ai didi

java - 在组装之后但在安装之前对 jar 进行后处理(以获得幂等构建)

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:48 24 4
gpt4 key购买 nike

我们使用 Jenkins,它使用 md5 指纹来识别 Artifact 以及 Artifact 自上次构建以来是否发生了变化。不幸的是,Maven 构建总是生成二进制不同的 Artifact 。

因此,我正在考虑让 Maven 为同一组输入文件生成相同的 jar Artifact ,而不管它们是在何时何地构建的,这意味着 jar 文件中的条目必须排序 - 不仅在索引,但按照它们写入 jar 文件的顺序。

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

我不熟悉编写 Maven 插件,所以我的问题是,我应该如何编写一个 Maven 知道如何判断 artifact-jar-in-progress 所在位置以及如何将其连接到我的 pom.xml 中的插件?

(起初我需要它来处理 jar 文件,但 war 文件也不错)。

最佳答案

如前所述,这可以基于类似于 maven-shade-plugin 的东西来完成。我继续编写了一个简单的插件来添加此功能——参见 https://github.com/manouti/jar-timestamp-normalize-maven-plugin (在 Central repo 上可用)。

该行为基于 shade 插件。它包含一个名为 normalize 的目标,可以绑定(bind)到 package 生命周期阶段并在项目的 POM 中配置:

<plugins>
<plugin>
<groupId>com.github.manouti</groupId>
<artifactId>jar-timestamp-normalize-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<id>jar-normalize</id>
<goals>
<goal>normalize</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>

关于插件的几点说明:

  1. 正在构建的 Artifact 通过 project#getArtifact() 访问,其中 project 是一个 org.apache.maven.project.MavenProject.

  2. 归一化主要包括三个步骤:

    • 将所有 Jar 条目的最后修改时间设置为特定时间戳(默认值为 1970-01-01 00:00:00AM 但可以通过 -Dtimestamp 更改 系统属性)。

    • list 中属性的重新排序(按字母顺序),但始终排在第一位的 Manifest-Version 除外。

    • pom.properties 文件中删除注释,其中包含导致 Jar 因构建而异的时间戳。

调用后,目标将在原始 Artifact 旁边生成输出文件(名为 artifactId-version-normalized.jar),即在 project.build.directory 目录。

关于java - 在组装之后但在安装之前对 jar 进行后处理(以获得幂等构建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24961072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com