java以jar包形式启动启动
-Djava.ext.dirs=lib的作用
以bat形式启动项目,linux环境需要改变语法
------------------------------
java -Djava.ext.dirs=d:\libs -classpath classes com.xxxclass
或者
设置环境变量
set lib = d:\libs
java -Djava.ext.dirs=%lib% -classpath classes com.xxxclass
java命令引入jar时可以-cp参数,但-cp只能指定一个固定jar包,不能用通配符(多个jar时要一个个写,不能*.jar),通常情况jar都在同一目录,且多于1个。可以使用-Djava.ext.dirs。
----------------------------
下面来说说-Djava.ext.dirs的坑
-Djava.ext.dirs是通过设置系统属性的方式也加载jar包的,这个级别就有点高,和-classpath的区别在于-Djava.ext.dirs会覆盖Java本身的ext设置,java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果您的程序没有指定该系统属性(-Djava.ext.dirs=d:\libs)那么该加载器默认加载$JAVA_HOME/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把$JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件,这意味着你将失去一些功能,例如java自带的加解密算法实现。
具体说是jre的ext目录:C:\Program Files\Java\jdk1.8.0_45。一般情况下普通程序运行并无差异,因为可以看到ext目录下也就几个jar,但是如果使用java.security相关类时,也就是使用加密解决相关的算法,就会发现-Djava.ext.dirs会导致library找不到相关类而报错。如报错:
NoSuchAlgorithmException: Cannot find any provider supporting RSA
这个错误当然也有可能是security\java.security文件中配置错误引起 。
当然也有解决方法:
1、将ext下相关jar包复制到新的ext director。
2、在-D.java.ext.dirs中配置多个目录。可以使用冒号分隔(windows下使用分号)。
比如:-Djava.ext.dirs=-Djava.ext.dirs="libs\;%JAVA_HOME%\jre\lib\ext"。