今天写代码,满满的都是坑啊。。特此记录一下。
首先说明一下项目环境: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