大家在linux环境下使用命令行执行java程序时,经常要使用到大量外部的jar包或class文件,一般我们有哪些方式可以用呢?
例如:
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 那么该加载器默认加载 J A V A H O M E / l i b / e x t 目录下的所有 j a r 文件。但如果你手动指定系统属性且忘了把 J A V A H O M E / l i b / e x t 路径给加上,那么 E x t C l a s s L o a d e r 不会去加载 JAVA_HOME/lib/ext目录下的所有jar文件。 但如果你手动指定系统属性且忘了把JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载 JAVAHOME/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把JAVAHOME/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
JAVA 命令参数详解:
1、-D= set a system property 设置系统属性。
java -D参数简化加入多个jar
java命令引入jar时可以-cp参数,但时-cp不能用通配符(多个jar时什么烦要一个个写,不能*.jar),面通常的jar都在同一目录,且多于1个。前些日子找到(发现)-Djava.ext.dirs太好。
如: java -Djava.ext.dirs=lib MyClass
可以在运行前配置一些属性,比如路径什么的。
java -Dconfig=“d:/config/config.xml” Abc
这样在Abc中就可以通过System.getProperty(“config”);获得这个值了。
在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。
另外,javac -d <目录> 指定存放生成的类文件的位置
Key Meaning
file.separator Character that separates components of a file path. This is "/" on UNIX and "\" on Windows.
java.class.path Path used to find directories and JAR archives containing class files. Elements of the class path are separated by a platform-specific character specified in the path.separator property. java.home Installation directory for Java Runtime Environment (JRE)
java.vendor JRE vendor name
java.vendor.url JRE vender URL
java.version JRE version number
line.separator Sequence used by operating system to separate lines in text files
os.arch Operating system architecture
os.name Operating system name
os.version Operating system version
path.separator Path separator character used in java.class.path
user.dir User working directory
user.home User home directory
user.name User account name
所谓的
system porperty,system 指的是 JRE (runtime)system,不是指 OS。
System.setProperty(“net.jxta.tls.principal”, “client”);
System.setProperty(“net.jxta.tls.password”, “password”);
System.setProperty(“JXTA_HOME”,System.getProperty(“JXTA_HOME”,“client”));
可以利用系统属性来加载多个驱动