linux环境:
java -cp ./jar1.jar:./jar2.jar:./main.jar com.test.main.Main
java -cp ./main.jar:./jar1.jar:./jar2.jar com.test.main.Main
使用java -cp 命令的时候,classloader的加载顺序是从前往后的,并且会解析jar文件内的MANIFEST.MF文件内的Class-Path,所以如果具有相同包路径的class文件,在前面的会生效,后面的不会生效。
main.jar在MANIFEST.MF引用了jar_default.jar
jar1.jar和jar_default.jar都有一个class文件:com.haha.Conflict.class
第一种方式会使用jar1.jar的com.haha.Conflict.class
第二种方式会使用jar_default.jar的com.haha.Conflict.class
很多情况下只有一份业务代码,即上述样例中的main.jar,但是因为认证或者版本或者其它原因,不同的环境需要使用不同的三方包,即上述样例中的jar1.jar、jar2.jar、jar_default.jar,这时候一般使用java -cp来启动程序,将我们自己的程序放到最后才会达到我们期待的效果,否则会失败。
ps:最近和华为公司合作,因为使用了第二种方式导致在服务器启动一直通不过认证,但是在windows下使用相同命令成功了,是因为windows下没有jar_default.jar,所以启动成功了。经过一番折腾,了解java -cp机制后,在服务器使用了第一种方式成功了。