gpt4 book ai didi

java - 如何使用 japicmp 比较当前和以前构建中生成的 Artifact

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:17 24 4
gpt4 key购买 nike

我一直在寻找一些工具来捕获在我们项目的当前版本和之前版本中生成的 Artifact 之间的 Java 兼容性差异。该工具应该成为我们日常 CI/CD 构建的一部分。

谷歌搜索后,我打算使用 japicmp比较两个 SNAPSHOT 版本,因为我发现它满足了我的要求,而且项目维护得很好。

我尝试使用以下 POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.rohan</groupId>
<artifactId>TestProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>${project.groupId}:${project.artifactId}</name>

<build>
<plugins>
<plugin>
<groupId>com.github.siom79.japicmp</groupId>
<artifactId>japicmp-maven-plugin</artifactId>
<version>0.11.1</version>
<configuration>
<oldVersion>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>jar</type>
</dependency>
</oldVersion>
<newVersion>
<file>
<path>${project.build.directory}/${project.artifactId}-${project.version}.${project.packaging}</path>
</file>
</newVersion>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>cmp</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

但是,在执行期间,Maven 依赖项解析器从构建目标目录而不是本地存储库中获取 Artifact 的旧版本,这最终导致旧版本和新版本相同。我们的项目仅发布具有相同版本号的 SNAPSHOT 版本的 Artifact 。因此我被绑在那里...

有人可以告诉我怎么去这里吗?谢谢!

更新

我解决了这个问题,方法是在初始化阶段将旧的 SNAPSHOT Artifact 复制到不同的文件夹中,然后在打包阶段在 japicmp 中使用相同的 Artifact 。以下是我的 POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.rohan</groupId>
<artifactId>TestProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>${project.groupId}:${project.artifactId}</name>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-old-version</id>
<phase>initialize</phase>
<goals>
<goal>copy</goal>
</goals>
</execution>
</executions>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>${project.packaging}</type>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/olderVersion</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>com.github.siom79.japicmp</groupId>
<artifactId>japicmp-maven-plugin</artifactId>
<version>0.11.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>cmp</goal>
</goals>
</execution>
</executions>
<configuration>
<oldVersion>
<file>
<path>${project.build.directory}/olderVersion/${project.artifactId}-${project.version}.${project.packaging}</path>
</file>
</oldVersion>
<newVersion>
<file>
<path>${project.build.directory}/${project.artifactId}-${project.version}.${project.packaging}</path>
</file>
</newVersion>
</configuration>
</plugin>
</plugins>
</build>
</project>

如果有人能建议我更好的方法或更好的工具来解决我的问题,我将不胜感激。谢谢!

最佳答案

您的意思是您在 Maven 中滥用了 SNAPSHOT 的含义。 SNAPSHOT 是一种开发 Artifact ,应该经常更改并被每个构建周期覆盖。 maven 将首先在您的本地存储库中搜索指定的 Artifact ,它将在其中找到您的 最新版本,并每天第一次检查远程存储库是否有较新的 SNAPSHOT 版本。因此,SNAPSHOT 在 Maven 中具有特殊含义,不应用于发布。有关详细信息,请参阅 herehere .

japicmp的maven插件利用maven框架查找最新的SNAPSHOT。因此,它对查找过程没有影响,它将像所有其他 Maven 插件一样工作,并从本地存储库或远程存储库(如果它比本地存储库更新)获取最新的 SNAPSHOT。

请实现符合 maven 提案的发布程序,不要使用 SNAPSHOTS 作为“发布”,因为您的下一个构建将再次覆盖它。

如果出于某种原因您无法发布到您的 Nexus 存储库,您可能会考虑根据 maven 约定至少在您的本地存储库中安装您的发布。 This page解释了如何将本地 jar 文件安装为具有特定版本的 Maven Artifact 。

关于java - 如何使用 japicmp 比较当前和以前构建中生成的 Artifact ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49538948/

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