最近一直在被路径所困扰,为了以后更好的理解框架原理,今天决定花点时间好好整理一下
classpath
首先 classpath是指编译过后的的classes目录
- 对于maven的所有项目, 配置文件一般放在resources目录下, 当编译之后会自动复制到
classes
目录下 - 非maven的所有项目, 一般放在src目录下, 编译之后也会自动复制到
classes
目录下面. - 所有的web-app项目, 例如web.xml, spring的配置文件等等,是放在webapp/WEB-INF下面的,
如果想要引用resources或者src目录下的配置文件, 就在在配置文件的路径前加上classpath:, 例如MyBatis配置文件的引用.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:MybatisConfiguration.xml"/>
<property name="mapperLocations" value="classpath*:com/tenlee/mapper/UserMapper.xml"/>
</bean>
- 如果不加的的话,那么都要把配置文件放在
WEB-INF/
目录下面, 但这样不能单独运行java类进行调试了,必须要启动整个webapp, 比如这样
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/mvc-dispatcher.xml</param-value>
</init-param>
classpath 和 classpath*区别:
- classpath:只会到你的classes路径中查找找文件
- classpath *:不仅包含classes路径,还包括jar文件classes路径进行查找
classpath:
与classpath*
:的区别在于,前者只会从第一个classpath中加载,而后者会从所有的classpath中加载 如果要加载的资源,不在当前ClassLoader的路径里,那么用classpath:前缀是找不到的,这种情况下就需要使用classpath*:
前缀.- 另一种情况下,在多个classpath中存在同名资源,都需要加载,那么用
classpath:
只会加载第一个,这种情况下也需要用classpath*:
前缀. - 可想而知,用
classpath*:
需要遍历所有的classpath,所以加载速度是很慢的,因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*
一、“classpath”: 用于加载类路径(包括jar包)中的一个且仅一个资源;对于多个匹配的也只返回一个,所以如果需要多个匹配的请考虑“classpath*:”前缀;
@Test
public void testClasspathPrefix() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载
Resource[] resources=resolver.getResources("classpath:META-INF/INDEX.LIST");
Assert.assertEquals(1, resources.length);
//只加载一个匹配的Resource,且通过ResourceLoader.getResource进行加载
resources = resolver.getResources("classpath:META-INF/*.LIST");
Assert.assertTrue(resources.length == 1);
}
二、“classpath*”: 用于加载类路径(包括jar包)中的所有匹配的资源。带通配符的classpath使用“ClassLoader”的“Enumeration<URL>getResources(String name)”方法来查找通配符之前的资源,然后通过模式匹配来获取匹配的资源。如“classpath:META-INF/*.LIST”将首先加载通配符之前的目录“META-INF”,然后再遍历路径进行子路径匹配从而获取匹配的资源。
@Test
public void testClasspathAsteriskPrefix () throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//将加载多个绝对匹配的所有Resource
//将首先通过ClassLoader.getResources("META-INF")加载非模式路径部分
//然后进行遍历模式匹配
Resource[] resources=resolver.getResources("classpath*:META-INF/INDEX.LIST");
Assert.assertTrue(resources.length > 1);
//将加载多个模式匹配的Resource
resources = resolver.getResources("classpath*:META-INF/*.LIST");
Assert.assertTrue(resources.length > 1);
}
注意“resources.length >1”说明返回多个Resource。不管模式匹配还是非模式匹配只要匹配的都将返回。
- resources资源文件夹下面的所有配置文件都会被复制到classes文件夹下面
- 如果是web应用(及war包). 则classes文件夹会被复制到WEN-INF文件夹下面
- pom.properties文件内容
#Generated by Maven
#Mon Jul 30 10:06:23 CST 2018
version=1.0-SNAPSHOT
groupId=com.github.zhangkaitao
artifactId=shiro-example-chapter12
- createFiles.lst
com\github\zhangkaitao\shiro\chapter12\dao\PermissionDaoImpl.class
com\github\zhangkaitao\shiro\chapter12\credentials\RetryLimitHashedCredentialsMatcher.class
com\github\zhangkaitao\shiro\chapter12\entity\RolePermssion.class
com\github\zhangkaitao\shiro\chapter12\dao\PermissionDaoImpl$1.class
com\github\zhangkaitao\shiro\chapter12\service\PermissionServiceImpl.class
- inputFiles.lst
F:\shiro\shiro-example\shiro-example-chapter12\src\main\java\com\github\zhangkaitao\shiro\chapter12\service\RoleServiceImpl.java
F:\shiro\shiro-example\shiro-example-chapter12\src\main\java\com\github\zhangkaitao\shiro\chapter12\service\PermissionService.java
F:\shiro\shiro-example\shiro-example-chapter12\src\main\java\com\github\zhangkaitao\shiro\chapter12\dao\UserDao.java
Jar包文件夹结构如下
cincommon.jar
-->com
-->.class文件
-->META-INF
--> MANIFEST.MF
--> maven
-->com.feinno.perftrace
-->perftrace-bootstrap
-->pom.properties
-->pom.xml
src: source code 源代码
评论前必须登录!
注册