如何使用 japicmp 比较当前和以前构建中生成的工件
How to use japicmp to compare between artifacts generated in current and previous build
我正在寻找一些工具来捕捉 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 依赖项解析器正在从构建目标目录中获取工件的旧版本,而不是从本地存储库中获取,这最终导致旧版本和新版本相同。我们的项目仅发布具有相同版本号的 SNAPSHOT 版本的工件。因此我被绑在那里...
有人可以告诉我怎么去这里吗?谢谢!
更新
我解决了这个问题,方法是在初始化阶段将旧的 SNAPSHOT 工件复制到不同的文件夹中,然后在打包阶段在 japicmp
中使用相同的工件。以下是我的 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 是一种开发工件,应该经常更改并被每个构建周期覆盖。 maven 将首先在您的本地存储库中搜索指定的工件,它将在其中找到 您的 最新版本,并每天第一次检查远程存储库是否有更新的 SNAPSHOT 版本。因此,SNAPSHOT 在 Maven 中具有特殊含义,不应用于发布。有关详细信息,请参阅 here or here。
japicmp的maven插件利用maven框架查找最新的SNAPSHOT。因此,它对查找过程没有影响,它将像所有其他 Maven 插件一样工作,并从本地存储库或远程存储库(如果它比本地存储库更新)获取最新的 SNAPSHOT。
请执行符合 maven 提议的发布程序,不要使用 SNAPSHOTS 作为 "releases",因为您的下一个构建将再次覆盖它。
如果出于某种原因您无法发布到您的 Nexus 存储库,您可能会考虑根据 maven 约定至少在您的本地存储库中安装您的发布。 This page 解释了如何将本地 jar 文件安装为特定版本的 maven 工件。
我正在寻找一些工具来捕捉 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 依赖项解析器正在从构建目标目录中获取工件的旧版本,而不是从本地存储库中获取,这最终导致旧版本和新版本相同。我们的项目仅发布具有相同版本号的 SNAPSHOT 版本的工件。因此我被绑在那里...
有人可以告诉我怎么去这里吗?谢谢!
更新
我解决了这个问题,方法是在初始化阶段将旧的 SNAPSHOT 工件复制到不同的文件夹中,然后在打包阶段在 japicmp
中使用相同的工件。以下是我的 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 是一种开发工件,应该经常更改并被每个构建周期覆盖。 maven 将首先在您的本地存储库中搜索指定的工件,它将在其中找到 您的 最新版本,并每天第一次检查远程存储库是否有更新的 SNAPSHOT 版本。因此,SNAPSHOT 在 Maven 中具有特殊含义,不应用于发布。有关详细信息,请参阅 here or here。
japicmp的maven插件利用maven框架查找最新的SNAPSHOT。因此,它对查找过程没有影响,它将像所有其他 Maven 插件一样工作,并从本地存储库或远程存储库(如果它比本地存储库更新)获取最新的 SNAPSHOT。
请执行符合 maven 提议的发布程序,不要使用 SNAPSHOTS 作为 "releases",因为您的下一个构建将再次覆盖它。
如果出于某种原因您无法发布到您的 Nexus 存储库,您可能会考虑根据 maven 约定至少在您的本地存储库中安装您的发布。 This page 解释了如何将本地 jar 文件安装为特定版本的 maven 工件。