1 有用的命令行
java -cp 类搜索路径 主类名
如
java -cp ".;a.jar" org.docshare.Haha
应该是先搜索系统默认路径。
然后在先在当前目录下查找 org/docshare/Haha.class
如果找不到,会在a.jar中查找。再找不到,
java -jar a.jar
根据META-INF找到主类并执行。
java -Djava.ext.dirs=你放jar的路径
如果想加一个路径,则可以加一个系统变量 java.ext.dirs指向你自己的lib目录。
该系统太麻烦,也没必要,所以加一个-D参数就可以添加一个只作用于当前运行的系统变量。
如 java -Dfoo="some string" A
class A{
..main..{
System.out.println(System.getProperty("foo"));
}
}
2 类加载机制
每当JVM启动,
JVM启动后生成三个ClassLoader BootstrapLoader, ExtClassLoader 和AppClassLoader。前面的类加载器是后面的父加载器。
默认的类加载器为AppClassLoader, 加载类执行一下流程:
1 查看自己是否已经加载过此类,如果是,则直接返回加载过的。
2 如果没有加载,则请求父加载器加载,父加载器如果无法,则自行加载。
3 父加载器如果没有加载,就找他的父亲进行加载。
所以说,如果你自己定义一个java.util.Scanner类。使用默认的类加载器来加载Scanner肯定会得到系统定义的Scanner类,而不是你自己定义的。
那么实在是想改变这种加载机制怎么办? 使用自己的类加载器。
参考
[1] https://www.cnblogs.com/ahudyan-forever/p/6007458.html
[2] http://blog.csdn.net/briblue/article/details/54973413