Zenn
Open1

Duplicate class javax.inject.Injectをexcludeして解決する

log_suzakilog_suzaki

問題

ライブラリを追加して競合が発生.

Duplicate class javax.inject.Inject found in modules jetified-javaee-api-6.0-1 (org.apache.openejb:javaee-api:6.0-1) and jetified-javax.inject-1 (javax.inject:javax.inject:1)
Duplicate class javax.inject.Named found in modules jetified-javaee-api-6.0-1 (org.apache.openejb:javaee-api:6.0-1) and jetified-javax.inject-1 (javax.inject:javax.inject:1)
Duplicate class javax.inject.Provider found in modules jetified-javaee-api-6.0-1 (org.apache.openejb:javaee-api:6.0-1) and jetified-javax.inject-1 (javax.inject:javax.inject:1)
Duplicate class javax.inject.Qualifier found in modules jetified-javaee-api-6.0-1 (org.apache.openejb:javaee-api:6.0-1) and jetified-javax.inject-1 (javax.inject:javax.inject:1)
Duplicate class javax.inject.Scope found in modules jetified-javaee-api-6.0-1 (org.apache.openejb:javaee-api:6.0-1) and jetified-javax.inject-1 (javax.inject:javax.inject:1)
Duplicate class javax.inject.Singleton found in modules jetified-javaee-api-6.0-1 (org.apache.openejb:javaee-api:6.0-1) and jetified-javax.inject-1 (javax.inject:javax.inject:1)

原因

Gradleにimplementationを追加した時発生したエラー.
重複するクラスが異なるモジュールで見つかったため発生した競合エラー.
詳しくいうとjavax.injectパッケージに関連するクラスが2つのモジュールからインポートされているために発生したエラーです.

具体的に僕は以下のライブラリを追加したら発生しました.

implementation 'io.minio:minio:8.5.1'
implementation 'org.apache.openejb:javaee-api:6.0-1'

なのでexcludeしました.

implementation 'io.minio:minio:8.5.1'
implementation ('org.apache.openejb:javaee-api:6.0-1') {
    exclude module: "javax.inject"
}

minioとopenejbの競合回避はこの記事に書いてあります.

しかし同じエラーが発生しました.

解決

結論からいうと複数のライブラリで競合が発生していました.
このように競合が発生した場合"javax.inject"を含むすべてのライブラリにexclude module: "javax.inject"して下さい.
以下は一例です.

// Google Places API
implementation ('com.google.android.libraries.places:places:3.0.0'){
    exclude module: "javax.inject"
}

// Android test support libraries
implementation 'androidx.test.ext:junit:1.1.5'
implementation ('androidx.test.espresso:espresso-core:3.5.1'){
    exclude module: "javax.inject"
}

これでビルドが通るようになります.

ログインするとコメントできます