java 命令执行时默认的当前的执行路径为最高的classpath路径
方法一、使用Bootstrap Classloader来加载这些类
我们可以在运行时使用如下参数:
-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.
win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar
unix java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar
win32系统每个jar用分号隔开,unix系统下用冒号隔开
方法二、使用Extension Classloader来加载
java中系统属性java.ext.dirs指定的目录由ExtClassLoader加载器加载 ,默认加载$JAVA_HOME/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把$JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件,这意味着你将失去一些功能,例如java自带的加解密算法实现。
java -Djava.ext.dirs=/usr/local/java/jdk1.8.0_181/jre/lib/ext/:/usr/local/product/libstest/lib/ com.example.demo.HelloWebApplication
这样,在 /project/script/中的所有jar文件都会自动加入到classpath中,该命令在shell模式中运行正常。
java -cp -classpath
-cp和-classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上";"分隔,linux上是":"分隔。不支持通配符,需要列出所有jar包,用"."代表当前路径。
#!/bin/bash
cd `dirname $0`
BINPATH=`pwd`
cd ..
SERVERNAME=`pwd`
LIBDIR=$SERVERNAME/lib
CONFIGDIR=$SERVERNAME/conf
MAINCLASS=
LIBJARS=`ls $LIBDIR | grep .jar | awk '{print "'$LIBDIR'/"$0}' | tr '\n' ':'`
java -classpath $CONFIGDIR:$LIBJARS CONFIGDIR
方法三、还是用AppClassloader来加载,不过不需要classpath参数了
我们在MANIFEST.MF中添加如下代码:
Manifest-Version: 1.0
Class-Path: lib/hello-web-0.0.1-SNAPSHOT.jar lib/jackson-annotations-2.11.4.jar lib/jackson-core-2.11.4.jar lib/jackson-databind-2.11.4.jar lib/jackson-datatype-jdk8-2.11.4.jar lib/jackson-datatype-jsr310-2.11.4.jar lib/jackson-module-parameter-names-2.11.4.jar lib/jakarta.annotation-api-1.3.5.jar lib/jakarta.el-3.0.3.jar lib/jul-to-slf4j-1.7.30.jar lib/log4j-api-2.13.3.jar lib/log4j-to-slf4j-2.13.3.jar lib/logback-classic-1.2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-api-1.7.30.jar lib/snakeyaml-1.27.jar lib/spring-aop-5.3.3.jar lib/spring-beans-5.3.3.jar lib/spring-boot-2.4.2.jar lib/spring-boot-autoconfigure-2.4.2.jar lib/spring-boot-starter-2.4.2.jar lib/spring-boot-starter-json-2.4.2.jar lib/spring-boot-starter-logging-2.4.2.jar lib/spring-boot-starter-tomcat-2.4.2.jar lib/spring-boot-starter-web-2.4.2.jar lib/spring-context-5.3.3.jar lib/spring-core-5.3.3.jar lib/spring-expression-5.3.3.jar lib/spring-jcl-5.3.3.jar lib/spring-web-5.3.3.jar lib/spring-webmvc-5.3.3.jar lib/tomcat-embed-core-9.0.41.jar lib/tomcat-embed-websocket-9.0.41.jar
Main-Class: org.springframework.boot.loader.JarLauncher
每个单独的jar用空格隔开就可以了。注意使用相对路径。
另:如果META-INF 下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。
方法四、自定义Classloader来加载