Spring项目下的路径问题
今天做SpringBoot整合log4j2,但在设置log4j2的配置文件时,其他作者建议强调要用绝对路径,但用绝对路径移植性真的很差,于是尝试使用相对路径,于是乎,便有了这篇总结。
说明 | 举例 | |
---|---|---|
相对路径 | 相对于当前位置的路径 | ./intel/facereapi |
绝对路径 | 路径的绝对位置(唯一表示方法) | E:\workSpace\intelJ\facereapi |
需要注意的是:相对路径用正斜杠 ‘/’ 绝对路径用的反斜杠 ’ \ ’
在路径方面,不得不提的是classPath,在Eclipse和Idea中,这两个位置是不同的。
指定位置 | |
---|---|
Eclipse | WEB_INF/classes |
IDEA | target/classes |
虽然路径不同,但最终都是指向了classes文件夹。
那这个classes文件是用来放什么的呢?
通过编译器,我们将 *.java 文件会全部编译成为 *.class 文件,而这个classes就是存储 *.class文件的。
首先看一下笔者的包结构
同时看一下classes文件中的文件
classes中也有项目中对应的包,也就是说,编译器在编译java文件的同时,同时也创建了文件夹。
classes文件夹中也存放了 *.class文件与 *.yml等文件。因为这些文件夹都被创建在classes中,,所以classPath都能访问。而以上这些文件,对应的是src/main下的java文件以及resource文件,所以看起来像是,classPath访问的是这两个文件夹,但实际上classPath访问的是classes文件。
这样就不难理解classPath作用原理。
同时,笔者在看到其他的博客,有提到classPath与classPath*的区别
classPath: | 只会到你的class路径中查找找文件; |
classPath*: | 不仅包含class路径,还包括jar文件中(class路径)进行查找. |
路径符号 ’ / ’ 的理解
在Linux中,我们知道:
~ :代表家目录
/ :代表根目录
在Windows中,‘ / ’ 同样适用。
上图中的两行代码,用于测试路径用的。运行结果如下
我们可以看到,在使用 “ / ”的情况下,位置回到了classes文件的根目录下(因为使用的是Main.class),而 “” 相当于家目录。
这样也就不难理解,因为路径写错,而自动创建文件的创建位置了。(笔者在项目的根目录中,运行项目时,自动生成了/classPath/log文件)
所以使用相对,在xml的配置文件中,也不一定没要用绝对路径,只需要以项目的根目录为起点,做相对路径即可,如图。
最终,相对路径成功,日志自动进入log。