问题一:
我在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(类加载器)读取到了
在使用`-Djava.ext.dirs`启动Java项目时遇到SSLKeyException和NoSuchMethodError。解决方案包括修改启动脚本、理解-D参数对加载路径的影响,以及通过调整pom.xml配置确保配置文件正确加载。最终,通过在MANIFEST.MF中指定classpath解决了问题。
1684





