[JAVA-3245] I'm trying to connect to cluster from my Android application and I always get error "java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;" while trying to use connection string Created: 24/Mar/19  Updated: 22/Apr/19  Resolved: 22/Apr/19

Status: Closed
Project: Java Driver
Component/s: Connection Management
Affects Version/s: 3.10.1
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Sahil Bhatta Assignee: Jeffrey Yemin
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

MongoDb 4, Java version 10, Mongo version 4, java driver for Mongo 3.10.1



 Description   

I'm trying to connect to cluster from my Android application and I always get error "java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;" while trying to use connection string. If I try to connect to localhost, then it is connected. Upon research I thought it was dependency issues and even downgraded to 3.9 java version of MongoDb too. Still the issue exists.



 Comments   
Comment by Jeffrey Yemin [ 25/Mar/19 ]

Hi yugeshwor09@gmail.com,

Unfortunately Android, while Java-like, is not actually Java, and so does not support all the JDK APIs that are required by the Java API specification and also required for full use of the Java driver. In this case you're running into Android's lack of support javax.naming. While you could work around that by replacing your mongodb+srv URI scheme with a mongodb scheme, you will run into another problem: Android also does not support SCRAM-SHA256 authentication, on which the driver also depends.

Typically, what most users do is introduce an HTTP REST API layer on top of MongoDB, and use that for their mobile applications. That way, MongoDB usage remains on the server. MongoDB's Stitch service takes this approach, and now comes with a MongoDB Mobile service which lets you build applications with an instance of MongoDB running in Android itself.

Regards,
Jeff

Comment by Sahil Bhatta [ 25/Mar/19 ]

This line of code to connect to cluster causes error:
MongoClients.create("mongodb+srv:/sampleUserName:samplePassword@cluster0-sgwno.mongodb.net/test?retryWrites=true")

Following is the full errors on the statement:

java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150)
at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112)
at com.mongodb.ConnectionString.<init>(ConnectionString.java:371)
at com.mongodb.client.MongoClients.create(MongoClients.java:61)
at com.services.azuob.curatrip.presenter.RegistrationPresenter.connectToCluster(RegistrationPresenter.kt:9)
at com.services.azuob.curatrip.activity.MainActivity$onCreate$1.run(MainActivity.kt:17)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6942)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.directory.InitialDirContext" on path: DexPathList[[zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/base.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_dependencies_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_resources_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_0_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_1_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_2_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_3_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_4_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_5_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_6_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_7_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_8_apk.apk", zip file "/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/lib/arm64, /system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150) 
at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112) 
at com.mongodb.ConnectionString.<init>(ConnectionString.java:371) 
at com.mongodb.client.MongoClients.create(MongoClients.java:61) 
at com.services.azuob.curatrip.presenter.RegistrationPresenter.connectToCluster(RegistrationPresenter.kt:9) 
at com.services.azuob.curatrip.activity.MainActivity$onCreate$1.run(MainActivity.kt:17) 
at android.os.Handler.handleCallback(Handler.java:789) 
at android.os.Handler.dispatchMessage(Handler.java:98) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6942) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 
Suppressed: java.io.IOException: No original dex files found for dex location (arm64) /data/app/com.services.azuob.curatrip-KhIJVxFovgVU7JlXhERTDg==/split_lib_resources_apk.apk
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:353)
at dalvik.system.DexFile.<init>(DexFile.java:100)
at dalvik.system.DexFile.<init>(DexFile.java:74)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:374)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:337)
at dalvik.system.DexPathList.<init>(DexPathList.java:157)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:65)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:69)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:36)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:678)
2019-03-25 08:30:11.361 20892-20892/com.services.azuob.curatrip E/AndroidRuntime: at android.app.LoadedApk.getClassLoader(LoadedApk.java:711)
at android.app.LoadedApk.getResources(LoadedApk.java:944)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2303)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5943)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1764)
at android.os.Handler.dispatchMessage(Handler.java:105)
... 5 more

Comment by Jeffrey Yemin [ 24/Mar/19 ]

Please comment back with the following information:

1. the connection string you're trying to use (minus any credentials).
2. the full stack trace of the exception

Generated at Thu Feb 08 08:59:08 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.