2017-01-04 6 views
16

実行すると、アンドロイドスタジオのプロジェクトルートにgradlew assembleDebugコマンドが実行されます。アプリ:transformClassesWithJarMergingForDebug ' TransformException:java.util.zip.ZipException:gradlewを実行しているときに重複している項目assembleDebug

実行はタスクに失敗しました「:アプリ:transformClassesWithJarMergingForDebugを」間違っていた何

:建物のプロセスは、私はこのメッセージが表示されますナド失敗しました。 com.android.build.api.transform.TransformException:java.util.zip.ZipException:SLF4J:2つのJARファイルがある私のプロジェクトでは ORG/SLF4J/IMPL/StaticLoggerBinder.class

:エントリを複製-android-1.6.1-RC1.jarおよびslf4j-log4j12-1.7.21.jar。そして、この両方のジャーには、org.sl4j.impl.StaticLoggerBinderを含む2つのジャーが入っています。

android { 
    compileSdkVersion 23 
    buildToolsVersion "22.0.1" 
    defaultConfig { 
     applicationId "com.ias.caniasandroid" 
     minSdkVersion 18 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    dexOptions { 
     jumboMode true 
     javaMaxHeapSize "4g" 
    } 
    productFlavors { 
    } 
} 

dependencies { 
    debugCompile fileTree(include: ['*.jar'], dir: 'libs') 
    debugCompile files('libs/commons-lang3-3.4.jar') 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
} 

はどのように問題を解決することができますし、jarファイルの内容を変更せずに成功gradlew assembleDebugを実行します。

ここではappフォルダに配置されて、私のGradleファイルの内容は?

+0

のjarファイルを使用しないでくださいを使用することができドント場合。 Mavenからアーティファクトをインポートすると、競合は自動的に解決されます(可能な場合は、アーティファクトの指定されたすべてのバージョンの最新のものを選択します)。 –

+0

本当に2つのlibs * slf4j-log4j12 *と* slf4j-android *が必要ですか?または、1つは十分かもしれません。 2つのjarファイルの代わりに1つの依存関係のみを使用してください。 'compile 'org.slf4j:slf4j-log4j12:1.7.21'' –

答えて

9

だけでは、Gradleの依存関係にあるjarファイルから特定のクラスを除外することができslf4j-android-1.6.1-RC1

org/sl4j/impl/StaticLoggerBinder.class 
org/sl4j/impl/StaticMarkerBinder.class 
org/sl4j/impl/StaticMDCBinder.class 

から下のクラスを削除。

Copyタスクを使用してjarファイルを解凍し、目的のクラスを除外して、抽出されたクラスにファイル依存関係を追加します。

task unzipJar(type: Copy) { 
    from zipTree('slf4j-android-1.6.1-RC1.jar') 
    into ("$buildDir/libs/slf4j") //TODO: you should update this line 
    include "**/*.class" 
    exclude "org/sl4j/impl/StaticLoggerBinder.class" 
    exclude "org/sl4j/impl/StaticMarkerBinder.class" 
    exclude "org/sl4j/impl/StaticMDCBinder.class" 
} 

dependencies { 
    compile files("$buildDir/libs/slf4j") { 
     builtBy "unzipJar" 
    } 
} 

あなたのコードがをコンパイルするとき、それはeverythimeを行います。一方

、あなたがパッケージをコンパイルしたいのですが、あなたがそれらをコンパイルしてJARから除外したい場合は、

jar { 
    exclude('org/sl4j/impl/**') 
} 
+0

私は、同じライブラリの複数のバージョンがほとんどのクラス共通であると考えています。最終的に、1つのバージョンの未使用の未使用クラスと、別のバージョンの未使用クラスが残ってしまいます。 @bahtiyartanこのケースでは、ジャーの1つを完全に削除する方法です。 –

関連する問題