2016-12-07 6 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のブレークはマイナーバージョンの変更について報告されるべきです。

「trueに設定すると、プラグインは古いアーカイブと新しいアーカイブのバージョンを分析し、バイナリ互換または互換性のない変更が許可されているかどうかに基づいてこれらのバージョンに基づいて決定します。オプションは、Major.Minor.Patch(1.2.3または1.2.3-SNAPSHOTなど)の形式でバージョンを期待しています。述べsemver.org

japicmp後でリンク:「あなたは後方互換性のある方法で機能を追加マイナーバージョンは、」 - だから、インタフェースへの新しい方法が明確にAPIの休憩です。

メソッドを追加するのではなくインターフェイスを削除すると、ビルドが失敗することがあります。

私はこのユースケースのテストを見つけました:CompatibilityChangesTest#testMethodAddedToInterface:それはツール自体ではなく、セットアップに問題があるようです。

私は何をしましたか?何を見落としましたか?

答えて

2

インターフェイスにメソッドを追加することは、実際にはバイナリ互換です。これは、ライブラリを使用するアプリケーションが新しいメソッドについて知らないため呼び出さないためです。 JVMは、インタフェースで定義されたすべてのメソッドをクラスが実装しているかどうかを実行時にチェックしません。これはコンパイラによってのみ行われます。

インターフェイスへのメソッドの追加は、不可能なソースのみです。つまり、変更されたインターフェイスに対してソースコードを再コンパイルすると、インターフェイスを実装するクラスが新しいメソッドを実装する必要があるため、コンパイルは失敗します。

関連する問題