mongodb-java 有用户名密码时提示“XXXX(一个加密算法)is not available”的解决方案

今天写代码,满满的都是坑啊。。特此记录一下。

首先说明一下项目环境:Maven + mongodb-java-driver-3.2.2

原来的项目是用mongo 2.x的驱动写的,然后把它升级到3.x。首先有一个很大的变动就是用户名和密码验证这块。

这是获取MongoClient的方法。

[java] view plain copy

import java.util.ArrayList;  

import java.util.List;  

import java.util.Properties;  


import com.mongodb.MongoClient;  

import com.mongodb.MongoClientURI;  

import com.mongodb.MongoCredential;  

import com.mongodb.ServerAddress;  


/**

 * MongoDBUtils

 * @author administration

 *

 */  

public class DBUtil {  


/**

     * 有用户名密码的方式连接mongoDB(MongoCredential方式)

     * @param mongodbAddr

     * @param databaseName

     * @return

     */  

public static MongoClient getMongoClientByCredent(String mongodbAddr, String databaseName){  

        MongoClient mongoClient;  

Properties p = TDTFile.getProperAddr("db.properties");  

String user = p.getProperty("username");  

String pswd = p.getProperty("password");  

List serverAddrList =new ArrayList();  

ServerAddress serverAddress =new ServerAddress(mongodbAddr);  

        serverAddrList.add(serverAddress);  

List credentialList =new ArrayList();  

        MongoCredential credential = MongoCredential.createCredential(user, databaseName, pswd.toCharArray());  

        credentialList.add(credential);  

mongoClient =new MongoClient(serverAddrList, credentialList);  

return mongoClient;  

    }  


/**

     * 有用户名密码的方式连接mongoDB(URI方式)

     * @param mongodbAddr

     * @param databaseName

     * @return

     */  

public static MongoClient getMongoClientByURI(String mongodbAddr, String databaseName){  

        MongoClient mongoClient;  

Properties p = TDTFile.getProperAddr("db.properties");  

String user = p.getProperty("username");  

String pswd = p.getProperty("password");  

//System.out.println(user + "," + pswd);  

String uri = String.format("mongodb://%s:%s@%s/%s", user, pswd, mongodbAddr, databaseName);  

        System.out.println(uri);  

MongoClientURI mongoClientURI =new MongoClientURI(uri);  

mongoClient =new MongoClient(mongoClientURI);  

return mongoClient;  

    }  


}  

两种方式都没问题,在eclipse下跑的好好的。但是!!用mvn package打包之后就不能用了,经过一晚上家一白天的分析之后,我把错误的根源锁定在了命令行执行命令的语句上。我的语句是这样的:

[html] view plain copy

java -Djava.ext.dirs=../lib 其他参数  

问题就出在这个-D参数,百度得知,-D是设置了相当于外部的环境变量的意思,由于我的main方法要依赖许多第三方jar包,这看起来也没什么错。但是却忽略了一个问题,就是使用-D参数指定其他目录后,java本来需要加载的%JAVA_HOME%\jre\lib\ext\目录下的jar包就不在加载了!!在网上搜了半天-D参数的用法,居然没有人提到过这一点。。可是给我坑苦了。一天的时间就浪费在这里。。

解决方案:

将需要的外部依赖包,包括jdk自带的一些加密算法之类的包,一起用maven打包到lib下。问题解决。顺便说一下,mongodb3.x需要的算法包是:%JAVA_HOME%\jre\lib\ext\sunjce_provider.jar

你可能感兴趣的:(mongodb-java 有用户名密码时提示“XXXX(一个加密算法)is not available”的解决方案)