【问题标题】:How to create java library using external dependencies in Gradle?如何在 Gradle 中使用外部依赖项创建 java 库?
【发布时间】:2016-04-09 01:58:31
【问题描述】:

我已经在 Android Studio 中的 Gradle 依赖项上苦苦挣扎了 4 天以上。

我正在尝试创建一个需要一些外部依赖项的 java 库 (MyLibrary),即 commons-codec。我将它添加到我的 build.gradle 中,看起来像这样。

    apply plugin: 'com.android.library'

    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.3"
        useLibrary 'org.apache.http.legacy'

        defaultConfig {
            minSdkVersion 21
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        lintOptions {
            abortOnError false
        }
    }

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.3.0'
        compile 'com.google.android.gms:play-services:8.4.0'
        compile 'commons-codec:commons-codec:1.10'
    }

我能够在 Android Studio 中组装我的调试和发布 AAR 文件。现在在我的 Android 项目中,我通过将 MyLibrary 导入为 AAR 模块来添加它,并为我的项目设置 build.gradle 文件,如下所示:

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.3"

    //    useLibrary 'org.apache.http.legacy'

        defaultConfig {
            applicationId "com.my.package"
            minSdkVersion 21
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    repositories {
        mavenCentral()
        flatDir {
            dirs 'libs'
        }
    }

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.2.0'
        compile 'com.google.android.gms:play-services:7.8.+'
        compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
        compile 'commons-codec:commons-codec:1.10'
        compile project(':MyLibrary')
    }

项目构建,应用已安装,但在执行使用 common-codec 的部分代码时崩溃。

FATAL EXCEPTION: Thread-172468 java.lang.NoSuchMethodError: No static method encodeHexString([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Hex; or its super classes (declaration of 'org.apache.commons.codec.binary.Hex' appears in /system/framework/ext.jar) at org.apache.commons.codec.digest.DigestUtils.sha256Hex

我的问题是,为什么 MyLibrary 中不包含 common-codec?

谢谢

【问题讨论】:

  • 你使用的是本地maven吗?
  • @TooManyEduardos。我正在使用 mavenCentral。我包含了来自 myLib 和 myProj 的完整 build.gravel 文件
  • 这不会解决眼前的问题,但不要使用重叠的依赖关系。您的库项目使用 play-services 和 commons-codec,因此您的应用不需要。

标签: java android android-studio gradle


【解决方案1】:

我认为您对错误的解释是错误的。它是 NoSuchMethodException 而不是 ClassNotFoundException。前者意味着找到了该类(在类路径上的某个位置),它只是没有一个签名与您要调用的签名匹配的方法。

因此,运行时类路径上必须有一个不同(即较旧)版本的 commons-codec

在谷歌搜索错误后,我发现这是 android 和commons-codec 的一个常见问题,因为显然 android 框架捆绑了它自己的版本。有关详细信息和可能的解决方案,请参阅此问题:Method not found using DigestUtils in Android

【讨论】:

  • 谢谢大卫,我认为你是对的。公共编解码器有一些疯狂的问题。我在 apache 网站上尝试了 (commons-codec 和 org.lucee) 的各种版本,但找不到一个可以工作。为什么?找不到类或方法。我终于停止使用 gradle 依赖项并手动下载了一个 commons-codec jar 文件并将其放在我的 libs 目录中,它仍然显示相同的错误(方法 404)严重???。我搜索并发现许多人面临同样的问题。我怎么知道该方法是否真的存在。在 Android 上生成字符串的 sha256 真的这么难吗? :[
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多