运行java -Djava.ext.dirs="/xxx/xxx/lib" xxx.xxx.MainClass
报错问题如下:
javax.net.ssl.SSLKeyException: RSA premaster secret error at sun.security.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:87) at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:912) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:348) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026) at sun.security.ssl.Handshaker.process_record(Handshaker.java:961) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:290) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:259) at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) at java.lang.Thread.run(Thread.java:745) Caused by: java.security.NoSuchAlgorithmException: SunTls12RsaPremasterSecret KeyGenerator not available at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:169) at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:223) at sun.security.ssl.JsseJce.getKeyGenerator(JsseJce.java:251) at sun.security.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:78) ... 22 more
跟踪了一下源码,发现他娘的java_home/jre/lib/security/java.security这个文件
只看关键位置
# # List of providers and their preference orders (see above): # security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=sun.security.ec.SunEC security.provider.4=com.sun.net.ssl.internal.ssl.Provider security.provider.5=com.sun.crypto.provider.SunJCE security.provider.6=sun.security.jgss.SunProvider security.provider.7=com.sun.security.sasl.Provider security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.9=sun.security.smartcardio.SunPCSC security.provider.10=sun.security.mscapi.SunMSCAPI # # Sun Provider SecureRandom seed source.
我这人比较懒,跟踪到这里不想跟下去了,直接百度得了
百度解决方法如下:
把java_home/jre/lib/ext目录下的sunjce_provider.jar复制到自己的lib目录即可解决
但是问题到此还没有结束,加上sunjce_provider.jar后上面问题没有了,但新的问题又来了,由于项目中要调用外部JS,直接运行java xxx.xxx.MainClass可以可以正常运行,但指定java.ext.dirs后又不正常了
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript");
运行上面的代码,发现engine为null,获取不了JS引擎,tnn的,问题还真多,又百度了一下,结果万能的百度也不顶用了,怎么办,自己脑筋急转弯了一下下,应该和上面的问题一样,但不确定缺少的是哪个jar包,跟踪了一下源码,发现缺少nashorn.jar这个包,这个也是在ava_home/jre/lib/ext目录下面, 这个是1.8的,其他低版本的是哪个我就不晓得了,因为Nashorn是1.8才加进来的,恩恩,问题解决了,其他版本自己慢慢去找了^_^