私は親POMといくつかのサブモジュールからなるmavenプロジェクトを持っています。それはIntellij内でコンパイルされ、正常に動作します(私はこれがMavenではなくjavac
を使用していると仮定しています)。POMで指定されていない依存関係を取り除くMaven
を実行すると、 "RequireUpperBoundDeps"のためにビルドが失敗します。これは、the documentationからビルド時に解決されたバージョンが同じアーティファクトの依存バージョンよりも低いことを意味します。ここで(消毒)出力されます:
[INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-maven) @ my-service ---
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:
Failed while enforcing RequireUpperBoundDeps. The error(s) are [
Require upper bound dependencies error for com.h2database:h2:1.3.168 paths to dependency are:
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.h2database:h2:1.3.168
and
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.example.libs:my-libs:2.0.0
+-com.h2database:h2:1.3.168 (managed) <-- com.h2database:h2:1.4.190
]
これはh2
はmy-service
の直接の依存関係であることを暗示しているようだが、それは、任意のPOMS、モジュールまたは親にそのように宣言されていません。 h2
は、my-libs
からのみ入力する必要があります。さらに、それはh2
がバージョン1.3.168
であることを「管理」していると主張する。私はこの情報をどこに得ているのか分かりません。 my-libs
はh2
バージョン1.4.190
を使用します。
私は明示的にh2
my-service
下(両方のバージョン)を含め、my-libs
依存からh2
を除く、完全に新鮮な.m2
ディレクトリから始まる試してみました。何も動作せず、依存関係からh2
を除外すると、データベースと対話するクラス(JDBI経由)のいずれかでNoSuchPropertyException
という結果になります。
h2
の正しいバージョンを認識してプロジェクトを組み込み、正常にビルドするにはどうすればよいですか?
プロジェクトのMaven依存関係ツリーを印刷しましたか? – Siddharth
はい。 'mvn dependency:tree'は、pomに宣言されていなくても、' my-service'の直接の依存関係として 'h2'を表示します。 – tytk
これは、h2がmy-serviceの依存関係であるmy-libsの依存関係であることを示しています。 h2はtransitve依存関係と呼ばれます。ですから、あなたはmy-libs pomファイルを調べる必要があります。これは、my-serviceのあなたがh2をバージョン1.3.168で宣言していたのに対し、enforcer-ruleの原因である1.4.190の宣言であることを示しています....あなたはmy-libsを最初にチェックしてください。依存関係の管理.... – khmarbaise