私のプロジェクトには、インターフェースを実装するクラスがあります。インターフェースは依存関係から来ています。より多くのメソッドを持つバージョンを除いて、それ自体が同じインターフェースを含むjarに依存している別の依存関係があります。同じpackage-interfaceを含む2つのjarは、同じgroupIdまたはartifactIdを持たないでください。
プロジェクトのクラスがすべてのメソッドを実装していないとコンパイラが文句を言うため、コンパイルが失敗します。コンパイラが間違ったjarからインターフェイス参照を取得しているためだと気づきました。私の質問は、なぜmavenは、プロジェクトPOMで明示的に言及したjarからのインターフェースではなく、推移的な依存関係からのインターフェースを使用するのですか?使用されているjarが定義の前半に表示されていることがわかります(クラスパスでも想像できます)が、これらの場合、Mavenは最短パスの依存関係から衝突するクラス/インターフェースを使用して解決したと思いました
これが依存関係ツリーの一部です。これはgrepされていますが、 (実際に使用されているもの)は(使用されるべきもの)javax.servlet:servlet-api
と比較してツリーの奥深くにあることがわかります。tomcat:servlet
[builder@ca-rd-build11 proj]$ mvn dependency:tree | grep servlet
[INFO] | +- javax.servlet:servlet-api:jar:2.4:compile
[INFO] +- tomcat:servlet:jar:4.0.6:compile
私はMaven3.0.4を使用しています