我的应用程序出了问题,我想在其中创建一个连接到我的服务器的简单XMPP客户端.
当我启动应用程序(编译运行没有问题)时,我遇到了以下问题,但我的应用程序立即关闭.
当我启动应用程序(编译运行没有问题)时,我遇到了以下问题,但我的应用程序立即关闭.
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jxmpp/util/XmppStringUtils; at org.jivesoftware.smack.provider.ProviderManager.getKey(ProviderManager.java:314) at org.jivesoftware.smack.provider.ProviderManager.addStreamFeatureProvider(ProviderManager.java:304) at org.jivesoftware.smack.provider.ProviderManager.addLoader(ProviderManager.java:140) at org.jivesoftware.smack.initializer.UrlInitializer.initialize(UrlInitializer.java:54) at org.jivesoftware.smack.SmackInitialization.loadSmackClass(SmackInitialization.java:232) at org.jivesoftware.smack.SmackInitialization.parseClassesToLoad(SmackInitialization.java:193) at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:163) at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:148) at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.java:116) at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96) at org.jivesoftware.smack.ConnectionConfiguration.<clinit>(ConnectionConfiguration.java:38) at org.reisacher.zapp.Main.login(Main.java:30) at org.reisacher.zapp.Main.onCreate(Main.java:73) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.ClassNotFoundException: Didn't find class "org.jxmpp.util.XmppStringUtils" on path: DexPathList[[zip file "/data/app/org.reisacher.zapp-1/base.apk"],nativeLibraryDirectories=[/vendor/lib,/system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469 at org.jivesoftware.smack.provider.ProviderManager.getKey(ProviderManager.java:314) at org.jivesoftware.smack.provider.ProviderManager.addStreamFeatureProvider(ProviderManager.java:304) at org.jivesoftware.smack.provider.ProviderManager.addLoader(ProviderManager.java:140) at org.jivesoftware.smack.initializer.UrlInitializer.initialize(UrlInitializer.java:54) at org.jivesoftware.smack.SmackInitialization.loadSmackClass(SmackInitialization.java:232) at org.jivesoftware.smack.SmackInitialization.parseClassesToLoad(SmackInitialization.java:193) at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:163) at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:148) at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.java:116) at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96) at org.jivesoftware.smack.ConnectionConfiguration.<clinit>(ConnectionConfiguration.java:38) at org.reisacher.zapp.Main.login(Main.java:30) at org.reisacher.zapp.Main.onCreate(Main.java:73) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Suppressed: java.lang.ClassNotFoundException: org.jxmpp.util.XmppStringUtils at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 27 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
但我不知道找不到任何与丢失的“XmppStringUtils”有关的东西
这是第30行的代码
public void login() throws XMPPException,IOException,SmackException { XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setServiceName("reisacher.de") .setHost("192.168.178.6") .setPort(5222) .build(); AbstractXMPPConnection connection = new XMPPTCPConnection(config); connection.connect(); connection.login(username,password); }
这些是我的进口商品
import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.tcp.XMPPTCPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
再加上我的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules. apply plugin: 'jetty' buildscript { repositories { maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' } } dependencies { compile "org.igniterealtime.smack:smack-android:4.1.1" compile "org.igniterealtime.smack:smack-tcp:4.1.1" // optional features compile "org.igniterealtime.smack:smack-android-extensions:4.1.1" compile "org.igniterealtime.smack:smack-core:4.1.1" } allprojects { repositories { jcenter() } }
谢谢
解决方法
从
NoClassDefFoundError’s javadoc开始:
Thrown if the Java Virtual Machine or a ClassLoader instance tries to
load in the definition of a class (as part of a normal method call or
as part of creating a new instance using the new expression) and no
definition of the class could be found.
Java使用动态链接,这意味着首次使用时会链接符号(类名,…).正如Mohit已经指出的那样,你似乎错过了JXMPP库,它是Smack的(传递)依赖.我假设您通过简单地将它放入libs /文件夹中,确实将Smack添加到您的项目中.不建议采用这种方法,因为你很容易错过Smack的一种特殊依赖性,就像它发生在你身上一样.而是使用能够解析Maven或Gradle等依赖关系的构建系统.也可以看看:
> How to use Smack 4.1 in Android?
> Smack 4.1 Readme and Upgrade Guide