java.lang.NoClassDefFoundError:解析失败:Ljavax/naming/directory/InitialDirContext;

Posted

技术标签:

【中文标题】java.lang.NoClassDefFoundError:解析失败:Ljavax/naming/directory/InitialDirContext;【英文标题】:java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext; 【发布时间】:2015-11-09 21:16:23 【问题描述】:

我正在尝试使用 android studio 中的 Smack 库构建一个具有 XMPP 协议的聊天应用程序。 通过使用 Smack 3.1.0 版,我可以轻松连接到开火服务器,甚至我向通过 spark 登录的用户发送了一条消息。但我永远无法收到来自该用户的消息,因为 MessageListener 的 processMessage 在编译中只运行了一次。因为我无法获得最喜欢的结果,所以我在互联网上搜索并发现 4.1 或更高版本仅支持 android。

所以我尝试使用 smack 4.1.4 构建我的应用程序并解决了许多错误。 但是一个错误没有解决,我在互联网上找不到它。 就是这样(当然还有太多错误,但我带来了前4名):

11-10 00:16:03.446 15512-15539/xmppconnectiontest2.ffisher.com.xmpp2  E/AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
11-10 00:41:36.169 19859-19886/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime:     at org.jivesoftware.smack.util.dns.javax.JavaxResolver.<clinit>(JavaxResolver.java:50)
11-10 00:41:36.169 19859-19886/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime:     at java.lang.Class.classForName(Native Method)
11-10 00:41:36.169 19859-19886/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime:     at java.lang.Class.forName(Class.java:308)

正如 igniterealtime 的文档所说,我添加了所有必要的库。 这是我在 Gradle 中的依赖项:

compile 'org.igniterealtime.smack:smack-core:4.1.4'
compile 'org.igniterealtime.smack:smack-tcp:4.1.4'
compile 'org.igniterealtime.smack:smack-extensions:4.1.4'
compile 'org.igniterealtime.smack:smack-resolver-javax:4.1.4'
compile 'org.igniterealtime.smack:smack-bosh:4.1.4'
compile 'org.igniterealtime.smack:smack-resolver-dnsjava:4.1.4'
compile 'org.igniterealtime.smack:smack-legacy:4.1.4'
compile 'org.igniterealtime.smack:smack-experimental:4.1.4'
compile 'org.igniterealtime.smack:smack-jingle-old:4.1.4'
compile 'org.igniterealtime.smack:smack-debug:4.1.4'

主要活动 onCreate :

 Thread t = new Thread(new Runnable() 
        @Override
        public void run() 
            String [] param = "mhs", "10.0.2.2";
            Asynchron asynchron = (Asynchron) new Asynchron();
            asynchron.doInBackground(param);
        
    );
    t.start();

我使用的 AsyncTask 的子类:

public class Asynchron extends AsyncTask <String, Void, Void>


    @Override
    protected Void doInBackground(String... params) 

        XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();

        builder.setServiceName(params[0]);

        builder.setHost(params[1]);

        builder.setPort(5222);

  builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);

        builder.setDebuggerEnabled(true);

        builder.setCompressionEnabled(true);

        connection = new XMPPTCPConnection(builder.build());
        SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");

        try 
            connection.connect();
            connection.login("testUser1", "1234");

         catch (SmackException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
         catch (XMPPException e) 
            e.printStackTrace();
        

        return null;
    

我真的需要你的帮助。 如何解决我在问题标题中写的错误?

【问题讨论】:

【参考方案1】:

只需使用:

compile "org.igniterealtime.smack:smack-android-extensions:4.1.0"
compile "org.igniterealtime.smack:smack-experimental:4.1.0"
compile "org.igniterealtime.smack:smack-tcp:4.1.0"

并删除builder.setCompressionEnabled(true);

【讨论】:

【参考方案2】:

删除依赖项中的 smack-resolver-javax。可能那个 jar 覆盖了一些遗留类

【讨论】:

是的,它成功了!但不幸的是,又出现了一些错误:11-10 01:15:56.477 13926-13953/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'byte[] org.jivesoftware.smack .util.stringencoder.Base64$Encoder.encode(byte[], int, int)' 在空对象引用上 太棒了!新的错误,我认为是代码相关的,encode 的参数似乎为空,检查它 去掉这段代码:builder.setCompressionEnabled(true);【参考方案3】:

只需使用smack-tcpsmack-experimentalsmack-android-extensions

【讨论】:

以上是关于java.lang.NoClassDefFoundError:解析失败:Ljavax/naming/directory/InitialDirContext;的主要内容,如果未能解决你的问题,请参考以下文章