weixin_42313540
2009-06-11 14:43 阅读 1.2k
已采纳

spring的ClassPathResource怎么知道具体的classpath指向的路径的

如题,我的开发环境是windows的一个web应用,但是是在一个main方法中直接加载配置文件

具体代码片段:
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:study/event/applicationContext-event.xml");

spring怎么知道classpath是哪个路径?

看了下ClassPathResource的源代码,在它的方法:
public InputStream getInputStream() throws IOException {
InputStream is = null;
if (this.clazz != null) {
is = this.clazz.getResourceAsStream(this.path);
}
else {
is = this.classLoader.getResourceAsStream(this.path);
}
if (is == null) {
throw new FileNotFoundException(
getDescription() + " cannot be opened because it does not exist");
}
return is;
}

里,程序运行到这里的时候this.path显示的是:study/event/applicationContext-event.xml,所以不知道spring是怎么知道去正确的路径查找资源(study/event/applicationContext-event.xml)的

[b]问题补充:[/b]
我很想知道spring是怎么知道classpath是哪个的?也就是说它是在什么地方确定了classpath目录的路径的?
[b]问题补充:[/b]
但是我系统都没有定义那个classpath。
[b]问题补充:[/b]
java.class.path这个系统属性是什么时候定义的呢?因为我自己是没定义的,所以我认为是不是:

1 如果是在IDE里面跑java程序,那么又IDE定义这个变量

2 如果是在服务器里面运行java程序,那么由服务器定义

是这样的吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • 已采纳
    ywbanm ywbanm 2009-06-11 17:47
    点赞 评论 复制链接分享
  • ywbanm ywbanm 2009-06-11 14:54

    classpath 指你当前目录
    相当于src下

    点赞 评论 复制链接分享
  • ywbanm ywbanm 2009-06-11 15:25

    我觉得classpath只是一个表示符,
    值应该是从system java.class.path里面取得的

    点赞 评论 复制链接分享
  • momo__1204 momo__1204 2009-06-11 15:46

    编译生成class文件的classes目录下的相对目录
    或者
    classpath环境变量里定义的路径

    这两者都可以

    点赞 评论 复制链接分享
  • ywbanm ywbanm 2009-06-11 16:10

    System.getProperty("java.class.path")

    你打出来看看就知道了

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 2009-06-11 17:21

    spring也是用的jdk的查找类路径方法啊

    if (this.clazz != null) {
    is = this.clazz.getResourceAsStream(this.path);
    //调用Class类的getResourceAsStream
    }
    else {
    is = this.classLoader.getResourceAsStream(this.path);
    //调用ClassLoader类的getResourceAsStream
    }

    Class类的getResourceAsStream
    public InputStream getResourceAsStream(String name)查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResourceAsStream(java.lang.String)。
    在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:

    如果 name 以 '/' 开始 ('\u002f'),则绝对资源名是 '/' 后面的 name 的一部分。
    否则,绝对名具有以下形式:
    modified_package_name/name
    其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。

    参数:
    name - 所需资源的名称
    返回:
    一个 InputStream 对象,或者 null(如果找不到带有该名称的资源)
    抛出:
    NullPointerException - 如果 name 是 null

    点赞 评论 复制链接分享

相关推荐