java.lang.IllegalStateException: Dex归档:仅为.CLASS文件设置.DEX扩展名

59

我在GitLab CI上构建了这个项目。

./gradlew assembleDebug --stacktrace

有时它会抛出一个错误:

FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.
> com.android.build.api.transform.TransformException: java.lang.IllegalStateException: Dex archives: setting .DEX extension only for .CLASS files

在我的本地电脑上,它可以正常工作。

Kotlin版本为1.2。

启用了multidex。

这个错误的原因是什么?


是的,我已经编辑了这个问题。 - m.myalkin
1
@AndiGeeky,不,异常并没有出现几天。 - m.myalkin
2
我在buddybuild上遇到了这个问题,但是在我本地开发机器上它却很正常。如果您有任何想法,欢迎分享。我尝试启用Multidexing,但没有改变任何东西。 - bartonstanley
删除 app/build 文件,然后运行应用程序。 - ashraful
@ashraful 我在CI服务器上运行它,因为每次构建都是干净的,所以没有构建目录。 - m.myalkin
显示剩余2条评论
12个回答

116

./gradlew clean 帮我解决了同样的错误。


2
不需要进行清理构建浪费时间,最好只是重新启动Android Studio。 - Vinayak Garg
1
@VinayakGarg:提问者提到他们正在通过GitLab CI构建,因此Android Studio在这里是无关紧要的。 - Nicolas Raoul
6
在 Cordova 项目中使用 ./platforms/android/gradlew clean 命令进行清理。 - anneb
58
在 Cordova 项目中,可以使用 cordova clean 命令来清理项目。 - Pierrick Martellière
1
在Flutter中使用flutter clean - ymerdrengene

58

对于Cordova开发人员,

如果您在项目中遇到此构建错误,并像Pierrick Martellière这个答案的评论中所说,在您的项目文件夹中使用以下命令:

cordova clean

它会立即进行清理和构建


3
没错,这是 Cordova 项目的解决方法。你也可以通过在命令的末尾添加 android 来清理 Android 端。 - TheTC

9

看起来我找到了解决方案。 在构建时,gradle对我显示了警告:

Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.

app: 'androidProcessor' dependencies won't be recognized as kapt annotation processors. Please change the configuration name to 'kapt' for these artifacts: 'com.arello-mobile:moxy-compiler:1.5.3' and apply the kapt plugin: "apply plugin: 'kotlin-kapt'".

我写错了单词,忘记删除库的不必要注释处理器:

annotationProcessor "com.arello-mobile:moxy-compiler:$moxyVersion"
kapt "com.arello-mobile:moxy-compiler:$moxyVersion"

所以我删除了第一行。

之后,我应用了kapt插件apply plugin: 'kotlin-kapt'并修复了代码中的一些构建错误。

最后,我意识到我忘记在某些地方替换compileimplementation。这很奇怪,但没有它,构建就无法正常工作。

这些更改修复了我的构建错误。


9

简单解决方案

适用于Ionic和Cordova项目

cordova clean

4
上面的回答大部分是正确的,但在我的情况下,当我创建同名的javakotlin文件,然后删除其中一个时,就会出现这个异常。
解决方法是:只需对我的项目进行构建 -> 清理项目,它就可以正常工作了。而且我的项目也启用了multiDex
defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }

4

如@mixel所述,清理可完成工作。但是,为了不手动执行此操作,只需将Gradle的“clean”任务添加到应用程序运行配置中,以便在启动之前始终进行清理。当然,这可能会使整个过程变慢一些。


1

我目前使用的是 Android Studio 3.3.2,我刚禁用了即时运行功能,它已经起作用了。


1

配置multidexing并没有解决我的问题。

然而,我想出了一个解决方法……某种程度上。基本上,它涉及在与失败构建相同的提交的第二个分支上创建拉取请求。这个拉取请求的构建成功了,然后Bitbucket认为原始的拉取请求没问题,允许我们合并,尽管我们在那个分支上没有做任何更改。这里有一些未经解释的奇怪现象,但这种技术是有效的。

这是我做的:

假设失败的分支名为bad-branch

我在bad-branchdevelop之间的公共提交上创建了一个名为bad-branch-copy的新分支。然后我将bad-branch合并到bad-branch-copy中。其结果是快进,使得bad-branch-copy最终停留在与bad-branch相同的提交上。我原本期望有一个单独的提交,所以这个结果让我感到惊讶,但我还是继续尝试。

我随后将bad-branch-copy推送到GitHub上,并从bad-branch-copy创建了一个拉取请求到develop。这触发了bad-branch-copy -> develop的构建,构建成功。
此时,buddybuild显示bad-branch-copy -> develop上的构建成功,但仍然显示bad-branch -> develop上的构建失败。然而,Bitbucket在bad-branch的拉取请求上显示构建成功。是的,没错:buddybuild显示失败,但Bitbucket说没问题。
然后,我们能够合并bad-branch的拉取请求,世界恢复了平静。请不要问我为什么,我不会回答。 :)
我认为同样的事情可以通过以下方式实现。
git checkout bad-build
git checkout -b bad-build-copy
git push origin bad-build-copy

跟着为bad-build-copy创建一个pull请求。

1

我通过关闭并重新启动Android Studio解决了这个问题。也许重新构建项目也可以解决(没有尝试过)。


重建会为我完成。 - Martin Marconcini

0

目前的解决方案都不适用于我,只需禁用即时运行即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接