但行好事
莫论前程❤

JAVA classpath和classpath*和配置文件路径的关系

最近一直在被路径所困扰,为了以后更好的理解框架原理,今天决定花点时间好好整理一下

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。不管模式匹配还是非模式匹配只要匹配的都将返回。

  1. resources资源文件夹下面的所有配置文件都会被复制到classes文件夹下面

1532917666509

  1. 如果是web应用(及war包). 则classes文件夹会被复制到WEN-INF文件夹下面

1532917851941

  1. 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

1532917912728

  1. 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
  1. 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 源代码

赞(2) 打赏
未经允许不得转载:刘鹏博客 » JAVA classpath和classpath*和配置文件路径的关系
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏