java项目中的classpath的理解
在java项目中,你一定碰到过classpath,通常情况下,我们是用它来指定配置/资源文件的路径。在刚开始学习的时候,自己也糊里糊涂,但是现在,是时候弄清楚它到底是指什么了。
顾名思义,classpath就是class的path,也就是类文件(*.class的路径)。一谈到文件的路径,我们就很有必要了解一个java项目(通常也是web项目)它在真正运行时候,这个项目内部的目录、文件的结构;这样,我们才好分析、理解classpath。
开发时期的web项目结构
下面,我以一个ssm的项目为例,我先把开发时候的项目的目录结构图放出来。根据maven的约定,一般我们的项目结构就像下面这样。
classpath用在哪里了?
而我们经常用到classpath的地方,就是在指定一些配置/资源文件的时候会使用到。比如说,我们在web.xml中指定springmvc的配置文件,如下图,我们使用:classpath:entry/dev/spring-mvc.xml
;再比如,当我们把*Mapper.xml文件放在了main/java/../mapping/
文件夹下时,在mybatis的配置文件中配置其位置,我们使用:
classpath*:**/mapper/mapping/*Mapper.xml
很显然,上面这2个classpath的配置,是为了告诉配置文件,去哪里寻找我们要指定的配置文件。要想弄清楚为什么是上面这样写的,我们就要来看看项目运行时(或者是发布后)的目录结构了。
web项目发布后的目录结构
我们使用IDEA对项目进行打包,一种是war包,一种是explorer的文件夹,war包解压后就是explorer了。我们来对解压后的目录结构进行分析。
经过对比,我们要注意到,开发时期的项目里,src/main/
下面的java
和resources
文件夹都被(编译)打包到了生产包的WEB-INF/classes/
目录下;而原来WEB-INF下面的views和web.xml则仍然还是在WEB-INF下面。同时由maven引入的依赖都被放入到了WEB-INF/lib/
下面。最后,编译后的class文件和资源文件都放在了classes目录下。
classpath原来是这个
在编译打包后的项目中,根目录是META-INF
和WEB-INF
。这个时候,我们可以看到classes这个文件夹,它就是我们要找的classpath。
在第1个例子里,classpath:entry/dev/spring-mvc.xml
中,classpath就是指WEB-INF/classes/
这个目录的路径。需要声明的一点是,使用classpath:
这种前缀,就只能代表一个文件。
在第2个例子里,classpath*:**/mapper/mapping/*Mapper.xml
,使用classpath*:
这种前缀,则可以代表多个匹配的文件;**/mapper/mapping/*Mapper.xml
,双星号**
表示在任意目录下,也就是说在WEB-INF/classes/
下任意层的目录,只要符合后面的文件路径,都会被作为资源文件找到。
相关文章
- 【华为云实战开发】1.传统Java项目怎么能变得高大上?
- 第二次正式java web开发项目的总结(回收站恢复)
- 【Java】java扩展机制SPI 实现
- 项目启动时报错:java.io.EOFException
- 基础知识《八》---Java反射机制
- Java邮件开发(三):解决附件名为乱码及显示友好名称
- [Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)
- Java 第十一届 蓝桥杯 省模拟赛 洁净数
- Java实现 洛谷 P2118 比例简化
- Java实现Catenyms(并查集+dfs+欧拉回路)
- Java实现 洛谷 P1738 洛谷的文件夹
- Java实现 洛谷 多项式输出
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- Java超类-java.lang.object
- Atitit web httphandler的实现 java python node.js c# net php 目录 1.1. Java 过滤器 servelet1 1.2. Python的
- Atitit 纯java项目的提升进度大法---通用json dsl接口
- paip.批处理清理java项目冗余jar的方法
- How to improve Java's I/O performance( 提升 java i/o 性能)
- 【项目实战】并发编程之Java中常见的并发编程模型
- java对象和json数据转换实现方式1-使用json-lib实现
- Java 8 中的 java.util.Map#computeIfAbsent
- 详解jvm之java类加载机制和类加载器(ClassLoader) 深入理解Java类加载器(ClassLoader) 如何自定义类加载器 深入说明双亲委派 双亲委派模型的破坏者-线程上下文类加载器
- java-信息安全(十二)-数字证书、CA证书【Java证书体系实现】
- Mac OS 安装 java JDK
- EJB类库存在于Java的哪个版本中?(选择1项)。
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )
- 数据结构 —— 树4种遍历,java代码实现
- 【java】Java 继承