4

我试图从Android库项目(非可执行文件)中使用具有依赖关系的Gradle构建.Jar文件,但是我得到NoClassDefFoundError,因为它正在访问其中一个文件来自依赖模块。创建Android LIbrary项目Jar使用具有依赖关系的Gradle

到目前为止,我已经尝试了FatJar方法,但它包括除依赖库之外的Jar文件中的所有内容。

我该怎么办?

UPDATE

我Gradle.build文件

apply plugin: 'android' 

    android { 
     compileSdkVersion 22 
     buildToolsVersion "21.1.2" 

     defaultConfig { 
      applicationId "com.myapplication" 
      minSdkVersion 9 
      targetSdkVersion 22 
      versionCode 1 
      versionName "1.0" 
     } 
     buildTypes { 
      release { 
       runProguard false 
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
      } 
     } 
     sourceSets { 
      main { 
       java { 
        srcDir 'src/main/java' 
       } 
       resources { 
        srcDir 'src/../lib' 
       } 

      } 
     } 
    } 

    dependencies { 
     compile fileTree(dir: 'libs', include: ['*.jar']) 
     compile 'com.android.support:appcompat-v7:22.0.0' 
     compile 'com.google.code.gson:gson:2.2.4' 
    } 

    task deleteOldJar(type: Delete) { 
     delete 'build/libs/AndroidPlugin.jar' 
    } 
    task exportJar(type: org.gradle.api.tasks.bundling.Jar) { 
     //from('build/intermediates/bundles/release/') 
     //from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
     // archiveName = "yourjar.jar" 

     from { 

      configurations.runtime.collect { 
       it.isDirectory() ? it : zipTree(it) 
      } 

      configurations.compile.collect { 
       it.isDirectory() ? it : zipTree(it) 
      } 
     } 
     into('release/') 
     include('classes.jar') 
     ///Give whatever name you want to give 
     rename('classes.jar', 'AndroidPlugin.jar') 
    } 

    exportJar.dependsOn(deleteOldJar, build) 
+0

DId你有什么解决方案吗?我也在构建一个jar库文件。请检查我的帖子[这里](http://stackoverflow.com/questions/32373117/error-while-creating-own-jar-library-for-android-project) – Kunu 2015-09-05 13:38:46

回答

0

在你的项目,创建内部app文件夹命名为 '库',并复制playservices的罐子。这是针对Android Studio的。

APP 
-libs 
-src 
-build 

在你的gradle构建:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile fileTree(dir: 'libs', include: ['*.so']) 


    compile files('libs/NameOfJar.jar') 



} 
+0

我不知道你是否正确理解了这个问题。 我想: 导出一个我的Android库项目的jar,里面装了maven dependsancies,因为我试图在另一个项目中使用这个Jar,但是我得到了NoClassDefFoundError。 我正在粘贴上面的当前gradle文件,请检查。 – 2015-04-02 09:25:01

3

有一个很好的插件,它可以产生脂肪罐容易:https://github.com/musketyr/gradle-fatjar-plugin。但它适用于java插件,与com.android.library btw冲突。

因此,我找到了一些解决方法。每个Jar文件实际上都是Zip文件。这意味着我们可以将其解压并将其内容添加到新的存档中。

有一小段代码产生脂肪罐,并将其推送到定义 本地/远程Maven仓库:

... 

apply plugin: 'maven-publisher' 

publishing { 
    publications { 
     maven(MavenPublication) { 
      artifact bundleRelease 
     } 

     mavenJava(MavenPublication) { 
      artifact fatJar 
     } 
    } 
} 

task fatJar(type: Jar) { 
    from (zipTree('libs/library-one.jar')) 
    from (zipTree('libs/library-two.jar')) 
    from (zipTree('libs/library-three.jar')) 
    from ('build/intermediates/classes/release/') { 
     exclude '**/BuildConfig.class' 
     exclude '**/R$*.class' 
     exclude '**/R.class' 
    } 
} 

... 

比你需要的只是运行:

$ ./gradlew clean build publishToMavenLocal 

附:如果您不想单独编写每个库,也可以遍历您的libs(包括*.jar)文件夹。