大家在linux环境下使用命令行执行java程序时,经常要使用到大量外部的jar包或class文件,一般我们有哪些方式可以用呢?
-classpath,命令格式:# java -classpath <目录或zip/jar文件的类搜索路径>,使用";"分隔
-cp ,这个命令一看就是-classpath的缩写,当然用途是一样的。
# java -cp ".\a.jar;.\b.jar" -jar myjar.jar MainClass
# java -cp .;c:\dir1\lib.jar Test
-Djava.ext.dirs,命令格式:# java -Djava.ext.dirs=<目录>
下面说一下区别:
-cp 和 -classpath 一样,是指定java类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上使用分号“;” 分隔,linux上是使用冒号“:”分隔。不支持通配符,也不支持文件夹的方式,需要列出所有jar包,用点“.”代表当前路径,这个如果要引用好多jar包,要一个个加入到路径里,那写起来就头疼。
如:java -cp .;c:\classes\myClass.jar;d:\classes\1.jar packname.mainclassname。
-Djava.ext.dirs是通过设置系统属性的方式也加载jar包的,这个级别就有点高了,和-classpath的区别在于-Djava.ext.dirs会覆盖Java本身的ext设置,java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果您的程序没有指定该系统属性(-Djava.ext.dirs=sss/lib)那么该加载器默认加载$JAVA_HOME/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把$JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件,这意味着你将失去一些功能,例如java自带的加解密算法实现。具体说是jre的ext目录:D:\java\jdk1.8.0_40\jre\lib\ext。一般情况下普通程序运行并无差异,因为可以看到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=directoryA:directoryB。