【问题标题】:gradle submodule has unresolvable dependenciesgradle 子模块具有无法解决的依赖关系
【发布时间】:2014-04-15 13:07:48
【问题描述】:

在 android studio 的一个 gradle 项目中,我的 android 模块旁边有一个纯 java 模块。此 java 模块依赖于 .jar 文件。当我运行我的 android 应用程序时,我得到了这个:

04-15 14:42:02.854  12528-12528/se.springworks.apiexample.androidexampleapp W/ApplicationPackageManager﹕ getCSCPackageItemText()
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp I/dalvikvm﹕ Failed resolving Lse/springworks/api/client/ServerConfig; interface 1557 'Lorg/aeonbits/owner/Config;'
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp W/dalvikvm﹕ Link of class 'Lse/springworks/api/client/ServerConfig;' failed
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp I/dalvikvm﹕ Failed resolving Lse/springworks/api/client/ServerConfig; interface 1557 'Lorg/aeonbits/owner/Config;'
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp W/dalvikvm﹕ Link of class 'Lse/springworks/api/client/ServerConfig;' failed
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp E/dalvikvm﹕ Could not find class 'se.springworks.api.client.ServerConfig', referenced from method se.springworks.api.client.M2HClient.<init>
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp W/dalvikvm﹕ VFY: unable to resolve const-class 1729 (Lse/springworks/api/client/ServerConfig;) in Lse/springworks/api/client/M2HClient;
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp D/dalvikvm﹕ VFY: replacing opcode 0x1c at 0x000c
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp I/dalvikvm﹕ Failed resolving Lse/springworks/api/client/ServerConfig; interface 1557 'Lorg/aeonbits/owner/Config;'
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp W/dalvikvm﹕ Link of class 'Lse/springworks/api/client/ServerConfig;' failed
04-15 14:42:02.864  12528-12528/se.springworks.apiexample.androidexampleapp D/AndroidRuntime﹕ Shutting down VM

java.lang.NoClassDefFoundError: se.springworks.api.client.ServerConfig
    at se.springworks.api.client.M2HClient.<init>(M2HClient.java:53)
    at se.springworks.apiexample.androidexampleapp.ExampleActivity.onCreate(ExampleActivity.java:23)
    at android.app.Activity.performCreate(Activity.java:5426)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
    at android.app.ActivityThread.access$900(ActivityThread.java:161)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:157)
    at android.app.ActivityThread.main(ActivityThread.java:5356)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
    at dalvik.system.NativeStart.main(Native Method)

现在,ServerConfig 是我自己的类,但它扩展了一个类“Config”,如上所示。这符合 Owner (http://owner.aeonbits.org/docs/usage/) 的用法。我不太明白为什么找不到这些类或出了什么问题。我试过直接在一个 android 模块中使用 owner 并且效果更好(首先,它不会崩溃)。据我所知,这是一个依赖配置问题,但我真的可以在这里使用。这是我使用缺少的类的子模块的 build.gradle 文件

apply plugin: 'java'

sourceCompatibility = 1.5
version = '1.0'

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
    }
}
dependencies {
    //Maven syntax groupings...
    compile group: "com.squareup.retrofit", name: "retrofit", version: "1.5.0"
    compile group: "com.squareup.okhttp", name: "okhttp", version: "1.5.3"
    testCompile group: 'junit', name: 'junit', version: '4.10'

    //Gradle syntax...
    compile 'commons-codec:commons-codec:1.2'
    //compile 'org.aeonbits.owner:owner:1.0.5'
    compile fileTree(dir: 'libs', include: '*.jar')

    testCompile 'org.mockito:mockito-all:1.8.4'
} 

这是 android 模块的 build.gradle:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile project(':m2h-api-java-client')
    compile 'com.android.support:appcompat-v7:19.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

我觉得可能缺少一些东西。

【问题讨论】:

  • 尝试将include: ['*.jar'])更改为include: '**/*.java'
  • 为什么要注释掉org.aeonbits.owner:owner:1.0.5 依赖?
  • 因为我使用的是 .jar。 :)

标签: java android gradle multi-module


【解决方案1】:

由于 ServerConfig 扩展自 org.aeonbits.owner.Config,如果类路径中缺少 org.aeonbits.owner:owner 依赖项,它将不会加载,并且 ClassLoader 将失败,就像您的情况一样。重新添加依赖即可。

【讨论】:

    【解决方案2】:

    默认情况下,生成jar时无法构建第三个依赖,在build.gradle中,配置jar任务如下:

    jar{
        baseName = "libdemo"
        version = "1.0"
        manifest {
            attributes ('Main-Class': 'com.example.lib.Main')
        }
        from {
            configurations.extraLibs.collect { it.isDirectory() ? it : zipTree(it) }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2017-02-20
      相关资源
      最近更新 更多