全栈君遇到的classpath疑惑:指向哪里及相关测试
大家好,又见面了,我是你们的朋友全栈君。

今天在项目中看到许多地方都运用了 classpath 。我自己对于 classpath 究竟指向何处还不是很明白,因此就在网络上通过百度进行了查询。
上面图片的意思简单来讲,classpath 仅能表示 lib 目录以及 WEB-inf/classes 路径下的文件,而 src 路径下的文件是 classpath 不能表示的。
从项目结构方面来看,配置文件通常不会放在 WEB-INF 下面。而且也没有发现 classes 路径。通常 lib 目录是用来放置依赖的 jar 包的呀。在这种情况下,感觉有些不妙了。接着又进行了测试,在 WEB-INF 路径下创建了 lib 和 classes 文件夹。
测试结果较为明显,无法访问 WEB-INF 下面的 classes 路径中的文件,也无法访问 WEB-INF 下面的 lib 路径中的文件,并且出现了报错。
我有一个想法,觉得不对。因为在项目中明明可以用 classpath 引入配置文件,可到底是怎么引入的呢?从第一张图和第二张图来看,是通过 classpath 访问到了 src 路径下面的 main/resources 文件中的配置文件。当打开编译后的项目时,发现项目文件中有一个名为.classpath 的文件,于是点开查看了一下。
具体classpath文件的介绍可以参考下面博客
.classpath 文件的作用是记录项目编译环境的各类信息。这些信息包含源文件的路径、编译后 class 文件的存放路径、依赖的 jar 包路径、运行的容器信息以及依赖的外部 project 等。倘若将此文件删除,那么 eclipse 就无法将该工程识别为一个正常的 java 工程,而仅仅会将其当作普通的文件夹,进而导致无法正常运行。
源文件的具体位置(kind 为“src”),运行的系统环境(kind 为“con”),工程的 library 的具体位置信息(kind 为“lib”)。在每个 lib 的 xml 子节点中,有关于它的其它配置信息,例如我配置的那个“javadoc_location”。还有项目的输出目录(kind 为“output”)。
总体上说这个文件就是配置整个工程的运行环境。
这很清楚,classpath 指的是(kind=”src”)所指定的文件。并且可以看到,此时(kind=”src”)的设置并未包含 WEB-INF 文件。此刻我们要验证 WEB-INF 文件被 classpath 访问是否与这个设置有关。
我们先把 applicationContext.xml 文件放置在 WEB-INF 路径之下,接着.classpath 文件的内容呈现为下图所示的样子,然后启动本项目。
打开项目的原始文件后,发现其中并没有出现 applicationContext.xml。
此时我们要在.classpath 文件里添加一个 classpathentry。这个 classpathentry 的 kind 是“src”,其 path 是“WebContent/WEB-INF”。
再次启动本项目
在项目的原始路径被打开后,发现 applicationcontext.xml 出现在了 WebContent/WEB-INF 之中。
由此可以总结:
在编译时生成的文件.classpath 中,存在类型为 classpath 路径且 kind=”src” 的部分。在项目中,能够以 classpath:xxx 的方式进行引用。同时,也可以手动添加或扩大 classpath 的范围。
你想知道 classpath 能够引用哪些地方的文件,打开.classpath 后,查看 kind=”src”的部分就能知晓了。
在编译生成的项目的 bulid/classes/ 下的文件,都是 classpath 路径下的文件,都能够通过 classpath 方法获取。(其中 classes 指的是编译后的文件)
“src 并非 classpath,真正的 classpath 是在编译后文件的存放路径,默认是 build/classes/,而不是 WEB-INF/classes 和 lib 等,这是编写项目时所看到的情况,如结论 2 所述,‘src 不是 classpath,WEB-INF/classes,lib 才是 classpath’这句话也是不对的”