在gradle依赖项脚本中使用“提供的项目”或其他错误未捕获的翻译时,我在app启动时为我的类com.xyz.sample.QuickSampleApplication获取了一个非常不寻常的 ClassNotFoundException 错误:java.lang.IllegalArgumentException:在gradle依赖项中使用“compile project”时已添加:。
实际错误:
E/AndroidRuntime(17749): java.lang.RuntimeException: Unable to instantiate application com.xyz.sample.QuickSampleApplication:
java.lang.ClassNotFoundException: Didn't find class
"com.xyz.sample.QuickSampleApplication" on path: DexPathList[[zip file
"/data/app/com.uei.sample.library-2.apk"],nativeLibraryDirectories=[/data/app-
lib/com.uei.sample.library-2, /vendor/lib, /system/lib]]
项目说明:
com.xyz.sample.QuickSampleApplication 由 com.xyz.sample.QuickSampleActivity 使用,并且这两个类位于同一个包中 com.xyz 。样品
com.xyz.sample.QuickSampleApplication 使用名为'quicksdklibrary'的JAR,我在gradle中将其作为“提供的依赖项”包含在内,请参阅下面的gradle代码段:
dependencies {
provided project(':quicksdklibrary')
//OR provided fileTree(dir: 'libs/MyExternalLibs', include: '*.jar')
compile 'com.android.support:appcompat-v7:21.0.0'
}
JAR实际上在IDE中解析,构建时没有错误,JAR的内部类对我的应用程序类是可见的,例如my:
com.xyz.sample.QuickSampleApplication 或com.xyz.sample.QuickSampleActivity。
com.xyz.sample.QuickSampleApplication com.xyz.sample.QuickSampleActivity在AndroidManifest.xml中正确声明/拼写:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xyz.sample.library"
android:versionCode="1"
android:versionName="1.0.002">
<uses-sdk android:minSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:name="com.xyz.sample.QuickSampleApplication">
<activity android:name="com.xyz.sample.QuickSampleActivity" android:screenOrientation="portrait"
android:label="@string/app_name" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
当我打开实际生成的.apk文件时,我发现我的com.xyz ...类没有打包在.apk中,为什么???
我尝试在依赖项标记中明确包含源代码:
compile fileTree(dir: 'src/main/java', include: ['*'])
OR
compile fileTree(dir: 'src/main/java/com/xyz', include: ['*'])
OR
compile fileTree(dir: 'src/main/java/com/xyz', include: ['*.java'])
OR
compile fileTree(dir: 'src/main/java', include: ['*.java'])
OR
compile file(libs/quicksdklibrary.jar)
根据评论也尝试使用sourceSets标签:
或使用sourceSets标记:
sourceSets {
main{
java {
java.srcDirs 'src/main/java'
}
}
}
OR
sourceSets {
main{
java {
java.srcDirs 'src/main/java/com/xyz'
}
}
}
但是生成的“.apk”仍然不包含类包com.xyz ...
有关此问题的最新更新,请参阅以下内容:
替代尝试#1:
当我在我的gradle中使用此标记时
dependencies {
compile 'com.android.support:appcompat-v7:23.0.1'
provided project(':quicksdklibrary')
}
然后我得到ClassNotFoundException (检查apk&amp; class classes.dex确认我的quicksdklibrary类没有包括在内),但是当我使用时:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// OR compile files(libs/:quicksdklibrary.jar)
// OR compile project(':quicksdklibrary')
compile 'com.android.support:appcompat-v7:23.0.1'
}
然后我得到了另一个错误,它甚至不允许我部署/安装apk:
:应用程序:preDexDebug
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/ACEUtils$Creator;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AEUtils;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AEngine;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/ATag;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/ABehavior;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AContext;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AControl$List;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AControl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AData;
UNEXPECTED TOP-LEVEL EXCEPTION:
Error:Execution failed for task ':app:preDexDebug'.
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException: Process 'command 'C:\Program
Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-zero exit value 2
**替代尝试:**
我真的检查了整个项目,并且还多次重新创建了项目,以确保我没有多次包含这个JAR,但是我仍然得到相同的错误“未捕获的翻译错误:java。 lang.IllegalArgumentException:已添加......“
我还重新安装了Android SDK,并将我的JDK更新为jdk1.7.0_80,但我仍然收到此错误。
我看看stackoverflow上的其他帖子,提到我应该删除支持库版本4或7的引用,我也尝试过。
其他尝试:
我还检查实际的JAR以查看是否创建了同一个包中具有相同名称的多个类,而不是。
我还尝试添加混淆版本,它将具有不同的类名,但是混淆版的JAR有“未捕获的转换错误:java.lang.IllegalArgumentException:已添加:..”错误!
问题:
如何解决此“未捕获的翻译错误:java.lang.IllegalArgumentException:已添加:”,为什么app:preDexDebug认为我的类有多个版本或尝试添加多个版本???
万分感谢所有人!
答案 0 :(得分:2)
我遇到了同样的问题,但答案与支持库有关。
compile 'com.android.support:appcompat-v7:21.0.0'
尝试创建一个没有支持库的新应用程序,或者只是尝试删除这个应用程序,看看会发生什么。
更新(您还应该检查是否存在):
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
答案 1 :(得分:0)
可能是你有两次添加库:
不要这样做。而是保持这两种方式中的任何一种。
意味着从库文件夹中删除jar
文件将更适合您。