java -Djava.ext.dirs= -jar 启动项目,产生的问题

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

我在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/引得就是eclipseJRE System Libraryjar

如图:

eclipse中JRE System Library的jar
如上图,这些jar全部来自jre目录下的 /lib/和/lib/ext/目录,只要将这两个目录的路径配到-Djava.ext.dirs参数中就能解决问题

最后的最后:

其实你不用-Djava.ext.dirs参数,就不会有上面的问题(不用-Djava.ext.dirs参数,java -jar启动的时候,会自动加载 eclipseJRE 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文件如下:
MANIFEST.MF文件
这样你读额外的配置就可以用ClassLoader(类加载器)读取到了

进程信息如下:bes 15708 11889 10 19:29 pts/0 00:00:38 /home/bes/jdk/jdk8/bin/java -Dcom.bes.instanceRoot=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1 -DHTTPS_PORT=18443 -DHTTP_PORT=18080 -DIIOPS_MUTUALAUTH_PORT=12400 -DIIOPS_PORT=12200 -DIIOP_PORT=12000 -DJMS_HOST=0.0.0.0 -DJMS_PASSWORD=admin -DJMS_PORT=12600 -DJMS_USER=admin -DJMX_PORT=11901 -DSPARK_PORT=13000 -Dcom.bes.ClassPathPrefix= -Dcom.bes.ClassPathSuffix= -Dcom.bes.ServerClassPath= -Dcom.bes.application.descriptor.cacheable=false -Dcom.bes.appserv.addon=com.bes.enterprise.server.addons.AddonImpl -Dcom.bes.classloader.appserverChainJars.ee= -Dcom.bes.classloader.appserverChainJars=mgmt-cmd.jar,mgmt-cmd-cluster.jar,j2ee-svc.jar -Dcom.bes.classloader.excludesList=mgmt-cmd.jar,bes-ant.jar -Dcom.bes.classloader.optionalOverrideableChain.ee= -Dcom.bes.classloader.optionalOverrideableChain=3rd/webservices-rt.jar,3rd/webservices-tools.jar -Dcom.bes.classloader.serverClassPath.ee=3rd/dmk.jar -Dcom.bes.classloader.serverClassPath=/home/bes/bes820/bin/../lib/system/apps/jmsra/jms-ra.jar,/home/bes/bes820/bin/../modules/mq/lib/jaxm-api.jar,/home/bes/bes820/bin/../modules/mq/lib/fscontext.jar,/home/bes/bes820/bin/../modules/mq/lib/jms-broker.jar,/home/bes/bes820/bin/../modules/mq/lib/jms-jmx.jar,ant/lib/ant.jar,3rd/dmk.jar -Dcom.bes.classloader.sharedChainJars.ee=bes-server.jar,bes-cluster.jar,monitor-framework.jar -Dcom.bes.classloader.sharedChainJars=javaee.jar,/home/bes/jdk/jdk8/lib/tools.jar,system/apps/jmsra/jms-ra.jar,3rd/bes-launcher-tools.jar,3rd/bes-logging-tools.jar,/home/bes/bes820/bin/../modules/mq/lib/jaxm-api.jar,/home/bes/bes820/bin/../modules/mq/lib/fscontext.jar,/home/bes/bes820/bin/../modules/mq/lib/jms-broker.jar,/home/bes/bes820/bin/../modules/mq/lib/jms-jmx.jar,/home/bes/bes820/bin/../modules/mq/lib/jms-xm.jar,3rd/webservices-rt.jar,3rd/webservices-tools.jar,mail.jar,bes-jstl.jar,3rd/jmxremote_optional.jar,3rd/dmk.jar,activation.jar,bes-core.jar,bes-mgmt.jar,bes-cmp.jar,ant/lib/ant.jar,ant/lib/ant-launcher.jar,3rd/dbschema.jar -Dcom.bes.configName=INST1-config -Dcom.bes.configRoot=/home/bes/bes820/bin/../config -Dcom.bes.defaultLogFile=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/logs/server.log -Dcom.bes.domainName=domain1 -Dcom.bes.enterprise.config.config_environment_factory_class=com.bes.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory -Dcom.bes.enterprise.overrideablejavaxpackages=javax.help,javax.portlet -Dcom.bes.enterprise.taglibs=bes-jstl.jar,jsf-impl.jar -Dcom.bes.enterprise.taglisteners=jsf-impl.jar -Dcom.bes.enterprise.web.connector.useCoyoteConnector=false -Dcom.bes.installRoot=/home/bes/bes820/bin/.. -Dcom.bes.instanceName=INST1 -Dcom.bes.processLauncher=SE -Dcom.bes.promptForIdentity=true -Ddomain.name=domain1 -Djava.endorsed.dirs=/home/bes/bes820/bin/../lib/endorsed -Djava.ext.dirs=/home/bes/jdk/jdk8/lib/ext:/home/bes/jdk/jdk8/jre/lib/ext:/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/lib/ext:/home/bes/bes820/bin/../modules/db/lib:/home/bes/bes820/bin/../lib/jdbcdrivers -Djava.library.path=:/home/bes/bes820/bin/../bin:/home/bes/bes820/bin/../lib:/home/bes/bes820/bin/../lib/3rd:/home/bes/bes820/bin/../modules/xerces:/home/bes/bes820/bin/../modules/xerces/64:64 -Djava.security.auth.login.config=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/config/security/login.conf -Djava.security.policy=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/config/security/server.policy -Djava.util.logging.manager=com.bes.enterprise.server.logging.ServerLogManager -Djavax.management.builder.initial=com.bes.enterprise.ee.admin.AppServerMBeanServerBuilder -Djavax.net.ssl.keyStore=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/config/security/keystore.jks -Djavax.net.ssl.trustStore=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/config/security/cacerts.jks -Djdbc.drivers=org.apache.derby.jdbc.ClientDriver -Djmx.invoke.getters=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -server -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/p:/home/bes/bes820/bin/../lib/agent/bes-serializer-bootstrap.jar -javaagent:/home/bes/bes820/bin/../lib/agent/bes-serializer-agent.jar -XX:MaxPermSize=192m -Xmx512m -Djava.net.preferIPv4Stack=true -XX:+LogVMOutput -XX:LogFile=/home/bes/bes820/var/domains/domain1/nodes/WebNode01/instances/INST1/logs/jvm.log -d64 -cp /home/bes/bes820/bin/../lib/bes-load.jar com.bes.enterprise.server.Entry start 但是执行jstat -gc 15708提示15708 not found这是因为什么
最新发布
12-05
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值