社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
1)Java ClassPath(类加载路径)
众所周知,Java执行的过程,首先时加载class文件到内存中,然后通过类加载器执行Class的加载过程。ClassPath即搜索class文件的路径,即类加载路径。
2)如何设置ClassPath
① java -classpath 选项设置
命令行或脚本执行Java程序时,通过-classpath选项指定类加载路径,可以是文件夹,或jar文件所在路径,AppClassLoader将加载classpath指定路径下的所有类。
② URLClassLoader中,通过URL的方式定位类加载路径
有兴趣的朋友,可以用tomcat web项目中的class文件做试验。
package org.lin.spl;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
public class Loader {
public static void main(String[] args) throws Exception {
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {
new File("lib/abc.jar").toURI().toURL(),
new File("WEB-INF/classes").toURI().toURL()
});
Class<?> obj = urlClassLoader.loadClass("org.abc.test.Abc");
System.out.println(obj.getClassLoader());
urlClassLoader.close();
}
}
3)ClassPath下资源加载
ClassPath下的class文件,以及properties等配置文件,在运行时都是可以通过Java代码获取的。
提供一个demo项目,作为资源加载的示例:
resources源文件夹下存放着db.properties配置文件,common-lang3-3.8.1.jar被添加到类路径(IDE中添加)。
ClassLoader、Class提供了方便的API获取类路径下资源(获取资源的URL)。也可以自己显示构造URL,并访问.jar文件。
package org.lin.demo;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collections;
import java.util.jar.JarFile;
public class Demo {
public static void main(String[] args) throws Exception {
//1.通过ClassLoader加载 ClassLoader.getResource、ClassLoader.getResourceAsStream均可
ClassLoader loader = ClassLoader.getSystemClassLoader();
//加载配置文件
System.out.println(loader.getResource("db.properties"));
//加载class文件
System.out.println(loader.getResource("org/lin/demo/Demo.class"));
//jar包内的文件亦可加载
System.out.println(loader.getResource("org/apache/commons/lang3/StringUtils.class"));
//ClassLoader加载不能使用绝对路径
System.out.println(loader.getResource("/db.properties")); //输出null
//2.通过Class加载,内部实际上调用ClassLoader加载
Class<Demo> clazz = Demo.class;
//Demo.class所在路径是 org/lin/demo/Demo.class,使用相对路径,起始路径是org/lin/demo
System.out.println(clazz.getResource(""));
//Class加载可使用绝对路径
System.out.println(clazz.getResource("/"));
//相对路径加载db.properties
System.out.println(clazz.getResource("../../../db.properties"));
//绝对路径加载db.properties
System.out.println(clazz.getResource("/db.properties"));
//3.URL路径方式显示加载Jar文件(前面的getResource返回的亦是URL)对象
//URL Uniform Resource Locator 统一资源定位符
//jar协议格式 jar:other/!/entryPath
URL url = new URL("jar:file:/D:/workspaceForTest/demo/lib/commons-lang3-3.8.1.jar!/");
//URLConnection是对URL资源访问的封装接口
URLConnection urlConnection = url.openConnection();
//jar协议的特定实现
JarURLConnection jarURLConnection = (JarURLConnection)urlConnection;
//获取JarFile
JarFile jarFile = jarURLConnection.getJarFile();
//把jar中的每个entry打印出来
Collections.list(jarFile.entries()).forEach(entry -> {
System.out.println(entry.getName());
});
//显示Manifest
jarFile.getManifest().getMainAttributes().entrySet().forEach(entry -> {
System.out.println(entry.getKey() + ":" + entry.getValue());
});
//4.关于user.dir系统属性
//user.dir 即用户工作目录,意思是执行java命令时,执行环境所在目录
//eclipse执行java命令时,以项目根目录作为user.dir
System.out.println(System.getProperty("user.dir"));
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!