1. Class.getResource和ClassLoader.getResource的区别
就是在加载资源文件的时候,加载方式的不同
class.getResource("/") == class.getClassLoader().getResource("")
其实,Class.getResource和ClassLoader.getResource本质上是一样的,都是使用 ClassLoader.getResource加载资源的。
Class.getResource真正调用ClassLoader.getResource方法之前,会先获取文件的路径(path不以'/'开头时,默认是从此类所在的包下取资源;path以'/'开头时,则是从项目的ClassPath根下获取资源)。
ClassLoader.getResource方法会通过双亲委派机制,先委派双亲去加载类,如果双亲没有加载到,则再由自己加载。
2. class path
The class path is the path that the Java Runtime Environment (JRE) searches for classes and other resource files.
这是Oracle 官方对class path的说明,意思是class path是JRE搜索类和其他资源文件的路径
在URLClassPath内部,维护了一个loaders列表(有序,根据classpath定义顺序),classpath下的每一个jar/目录和jdk下的jar都会在这个loaders中单独维护一个元素
3. java -cp 部署功能时候,指定resource配置文件的路径
若代码里通过getClassLoader().getResource("某个配置文件名")来读取配置文件,程序部署到linux环境时,假设目录结构:
project
|
|_ _ lib/ --放入依赖的jar包
|
|_ _ bin/ --本工程启动类jar包
|
|_ _ config/ --用到的配置文件,ClassLoader.getResource()要读取的
|
|_ _hadoop/ --其他的配置文件,例如hadoop配置文件
那么,程序可通过如下方式启动:
cd project
java -cp(或classpath) .:./config:./bin/projectDemo.jar:./lib/*.jar com.ghs.tool.demo.StartupMain
JVM就会按照指定的顺序进行加载至ClassPath
在JVM中,ClassPath中也有个hadoop目录(因为-classpath指定的./config在工程中目录下有hadoop目录,最后加载JVM中自然也会有)
其实这种结构很好理解,用IDEA模拟下就能看出来:
1)未指定config目录为Resources
编译后的目录结构:只有src源码的编译后的字节码文件
2)设置config目录为Resources(即跟java -cp ./config同样道理)
看下编译后的效果:
i)还可以将hadoop目录也设置为Resources,看看编译后目录结构
core-site.xml和hdfs-site.xml也放置classpath根目录下了
好了,希望对你有所帮助!
- 参考:https://blog.csdn.net/zhangshk_/article/details/82704010
- 参考https://blog.csdn.net/weixin_27210125/article/details/114097140



