2016-12-07 83 views
1

我测试出来的japicmp Maven的插件:构建不破次要版本变更

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

为了测试它,我复制一个现有的项目多次,增加了一个方法的接口(即打破了API)。

如果我只增加修补程序版本(1.0.0 - > 1.0.1),并且正确忽略主版本(1.0.0 - > 2.0.0),则会正确报告API中断。

但是,对于次要版本更改,不会报告。我可能在这里忽略了一些基本的东西,但是应该为小版本更改报告API中断。

我检查了manual,但它仅指出:“如果设置为true,插件将分析旧版本和新版本的档案,并根据这些版本决定是否允许二进制兼容或不兼容的更改。选项需要Major.Minor.Patch格式的版本(例如1.2.3或1.2.3-SNAPSHOT)。“

japicmp后链接semver.org,其中规定:“当你在一个向后兼容的方式添加功能次要版本” - 所以到接口的新方法显然是一个API突破。

如果我删除接口而不是添加一个方法,构建失败(因为它应该)。

我发现这个用例的测试:CompatibilityChangesTest#testMethodAddedToInterface:所以问题似乎是设置,而不是工具本身。

我做了什么?我忽略了什么?

回答

2

向接口添加方法实际上是二进制兼容的,因为使用您的库的应用程序不知道新方法,因此不会调用它。 JVM不会在运行时检查一个类是否实现了在接口中定义的所有方法,这只能由编译器完成。

向接口添加方法只是源不可计算的。这意味着,如果您针对更改后的接口重新编译源代码,则编译失败,因为您的类实现接口现在必须实现新方法。