如何使用 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 工件。