2015-05-31 8 views
6

Ho riscontrato un problema con la mia app in cui voglio creare un semplice client XMPP che si connette al mio server. Ho riscontrato il seguente problema quando avvio l'app (la compilazione viene eseguita senza problemi), ma la mia app si chiude immediatamente.Smack genera "NoClassDefFoundError: Risoluzione fallita di: Lorg/jxmpp/util/XmppStringUtils"

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 

Ma in qualche modo non riesco a trovare tutto ciò che riguarda i mancanti "XmppStringUtils"

Questo è il codice in linea 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); 
} 

E questi sono i miei importazioni

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; 

Plus my 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() 
    } 
} 

Grazie

+0

hai risolto questo errore? – CoronaPintu

+0

Sì, ho dimenticato di aggiungere le dipendenze nel 2 ° file build.gradle. Controlla se hai tutte le tue dipendenze in $ root/build.gradle e $ root/app/build.gradle. Questo ha risolto l'errore per me –

risposta

2

Da 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 utilizza il collegamento dinamico, il che significa che i simboli (nomi di classe, ...) sono collegate al primo utilizzo. Come già sottolineato da Mohit, sembra che manchi la libreria JXMPP, che è una dipendenza (transitiva) di Smack. Presumo che tu abbia aggiunto Smack al tuo progetto semplicemente inserendolo nella cartella libs/. Questo approccio non è raccomandato, in quanto ti manca facilmente una dipendenza trasandata da Smack, come è successo a te. Usa invece un sistema di build in grado di risolvere quelle dipendenze come Maven o Gradle. Vedere anche:

+0

Grazie, ho dimenticato di aggiungere le righe "compila ..." nel 2 ° file .gradle .Funziona come un incantesimo ora, senza il lavoro manuale della libreria –

8

Sono richiesti quattro file jar extra.

1) jxmpp-core.jar

2) jxmpp-jid.jar

3) jxmpp-stringprep-libidn

4) jxmpp-util-cache

Puoi scarica tutti dal link sottostante.

https://oss.sonatype.org/content/repositories/releases/org/jxmpp/

+2

grazie per avermi effettivamente inviato alle libs invece di dire "usa Maven" –

+0

Amen a quello ... –

3

Il problema viene da de.measite.minidns una dipendenza che hanno spinto un aggiornamento con un bug. Quindi l'ho risolto in questo modo escludendo l'auto-dipendenza e includendo l'ultima versione stabile. Ha risolto il mio problema.

compile('org.igniterealtime.smack:smack-android-extensions:4.2.0') { 
    exclude group: 'de.measite.minidns' 
} 
compile('org.igniterealtime.smack:smack-tcp:4.2.0') { 
    exclude group: 'de.measite.minidns' 
} 
compile group: 'de.measite.minidns', name: 'minidns-hla', version: '0.2.2' 
+0

Hai salvato il mio giorno. Molte grazie! –

Problemi correlati