首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当执行`gradle干净的assemble<BuildVarian>`‘时,Gradle不包括模块依赖项

当执行`gradle干净的assemble<BuildVarian>`‘时,Gradle不包括模块依赖项
EN

Stack Overflow用户
提问于 2015-01-22 14:45:09
回答 1查看 1.9K关注 0票数 1

我有一个多模块的Android项目。环境方面的一些输入数据:

代码语言:javascript
运行
复制
Android Studio 1.0.1
Gradle 2.2.1 (Gradle Wrapper)
Java 1.7.0_71
Android Gradle Plugin: 1.0.1

compileSdkVersion = 21
buildToolsVersion = '21.1.2'
minSdkVersion = 14
targetSdkVersion = 21

当我从Android运行这个项目时。应用程序在设备上正确编译和执行(对于所有构建变体)。但是,当我试图使用assemble或任何其他构建变体(我有4: debug、alpha、beta、release)从终端上运行应用程序时,构建成功了,但是当我试图运行它时,应用程序就会崩溃,其中包含模块项目中定义的任何类的java.lang.NoClassDefFoundError

我排除了ProGuard的嫌疑,因为它只在varian版本上运行。但是这个问题对于所有的构建都是一致的。

此外,我还检查了模块是否包含重复的依赖关系。

编辑

一个可定位的堆栈跟踪:

代码语言:javascript
运行
复制
9553-9553/my.package.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: my.package.app, PID: 9553
java.lang.NoClassDefFoundError: my.package.module1.Go
        at my.package.app.MyApplication.onCreate(MyApplication.java:59)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4729)
        at android.app.ActivityThread.access$1600(ActivityThread.java:174)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5593)
        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:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)

如您所见,类Go是包my.package.module1的一部分,它是在子模块:module1中定义的(参见构建脚本源)。

等级建设的一部分:

代码语言:javascript
运行
复制
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies{
        classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
    }
}

apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.application'

android {

    // ...
    // Compile and tools version

    defaultConfig {
        // Target sdk and so on
        applicationId 'my.package.app'

        // ...
        // Other stuff regarding version

    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    buildTypes {

        release { // ... }

        alpha { // ... }

        beta { // ... }

        debug { // ... }
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

dependencies {
    // ...
    // Standatrt dependencies like support lib and others

    compile project(':module1')
    compile project(':module2')
    compile project(':module3')

    // Other moduels
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 00:13:44

在浏览构建脚本并比较构建与终端构建的方式之后,我无意中发现了下一个不同之处:

  1. 当清理该项目时,它还对所有模块项目执行generate<BuildVarian>Sourcesgenerate<BuildVarian>TestSources (这是按照这样的方式安排的,即在运行实际的汇编命令之前总是执行它)
  2. 当从终端运行./gradlew clean assembleDebug时,gradle无法及时获取导出的子模块arrs。可能是Gradle 2.2 (2.2.1)或Android插件中的一个bug --我不记得以前的版本有过这样的问题
  3. 在运行./gradlew clean generateDebugSources generateDebugTestSources assembleDebug时,问题仍然存在--可能也与错误有关。

温度溶液

依次执行以下命令:

代码语言:javascript
运行
复制
# ./gradlew clean generate<BuildVariant>Sources generate<BuildVariant>TestSources
# ... task output
# ...
# ./gradlew assemble<BuildVariant>

这样,输出apk将与所有模块项目组装在一起。

长期解

发射了一个发行票这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28091560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档