问题一:
我在shell脚本中用:
nohup java -Djava.ext.dirs=${DIR}/ -jar ${DIR}/${JAR_NAME} > ${DIR}/nohup.out &
启项目,请求https
报了以下错误:
Caused by: javax.net.ssl.SSLKeyException: RSA premaster secret error
问题二:
为解决问题一,将:
jre目录下的/lib/ext/sunjce_provider.jar
加到自己的jar
包同级目录后
启动报以下错误:
Caused by: java.lang.NoSuchMethodError: sun.security.internal.spec.TlsMasterSecretParameterSpec.getExtendedMasterSecretSessionHash()
并且程序直接退出。
最后:
改启动脚本如下:
nohup java -Djava.ext.dirs=${DIR}/:${JRE_DIR}/lib/:${JRE_DIR}/lib/ext/ -jar ${DIR}/${JAR_NAME} > ${DIR}/nohup.out &
问题全部解决了
总结原因:
1.由于我打包方式的问题,导致配置文件没有加载到classpath
目录下,为了解决配置文件加载问题我用了java -Djava.ext.dirs=${DIR}/ -jar ${DIR}/${JAR_NAME}
,但是这样一来java
自带的一些加密解密的jar包
,就不会自动加进来了,详情可以百度。
2.-Djava.ext.dirs=${DIR}/:${JRE_DIR}/lib/:${JRE_DIR}/lib/ext/
中:
${DIR}/
是jar所在目录,
${JRE_DIR}/lib/:${JRE_DIR}/lib/ext/
引得就是eclipse
中JRE System Library
的jar
如图:
如上图,这些jar全部来自jre目录下的 /lib/和/lib/ext/目录
,只要将这两个目录的路径配到-Djava.ext.dirs
参数中就能解决问题
最后的最后:
其实你不用-Djava.ext.dirs
参数,就不会有上面的问题(不用-Djava.ext.dirs参数,java -jar启动的时候,会自动加载 eclipse
中JRE System Library
显示的这些jar
),但还会有配置文件加载的问题,可以用 java -cp代替,最好的解决方式如下,在pom中加入以下plugin的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<!-- 把jar包所在目录和jar包所在目录下的config目录加到manifest的classpath中 -->
<Class-Path>. ./config/</Class-Path>
</manifestEntries>
</archive>
<excludes>
<exclude>lib/**</exclude>
<exclude>templates/**</exclude>
<exclude>config/**</exclude>
<exclude>*.properties</exclude>
<exclude>*.config</exclude>
<exclude>*.json</exclude>
<exclude>*.xml</exclude>
<exclude>*.proto</exclude>
<exclude>*.yml</exclude>
<exclude>mapper/**</exclude>
<exclude>doc/**</exclude>
</excludes>
</configuration>
</plugin>
pom加入以上配置,就是把jar包所在目录和jar包所在目录下的config目录加到manifest的classpath中。
这样配置后打包生成的MANIFEST.MF文件如下:
这样你读额外的配置就可以用ClassLoader(类加载器)读取到了