sPath 的绝对 URI 路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 4,FileTest.class.getClassLoader().getResource("") 得到的也是当前 ClassPath 的绝对 URI 路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 5,ClassLoader.getSystemResource("") 得到的也是当前 ClassPath 的绝对 URI 路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 我 推 荐 使 用 Thread.currentThread().getContextClassLoader().getResource("") 来 得 到 当 前 的 classpath 的绝对路径的 URI 表示法。 Web 应用程序中资源的寻址 上文中说过,当前用户目录,即相对于 System.getProperty("user.dir")返回的路径。 对于 JavaEE 服务器,这可能是服务器的某个路径,这个并没有统一的规范! 而不是我们发布的 Web 应用程序的根目录! 这样,在 Web 应用程序中,我们绝对不能使用相对于当前用户目录的相对路径。 在 Web 应用程序中,我们一般通过 ServletContext.getRealPath("/")方法得到 Web 应用程 序的根目录的绝对路径。 这样,我们只需要提供相对于 Web 应用程序根目录的路径,就可以构建出定位资源的 绝对路径。 这是我们开发 Web 应用程序时一般所采取的策略。 通用的相对路径解决办法
Java 中各种相对路径非常多,不容易使用,非常容易出错。因此,我编写了一个便利方 法,帮助更容易的解决相对路径
问题。 Web 应用程序中使用 JavaSE 运行的资源寻址问题 在 JavaSE
程序中,我们一般使用 classpath 来作为存放资源的目的地。但是,在 Web 应 用程序中,我们一般使用 classpath 外面的 WEB-INF 及其子目录作为资源文件的存放地。 在 Web 应用程序中,我们一般通过 ServletContext.getRealPath("/")方法得到 Web 应用程 序的根目录的绝对路径。这样,我们只需要提供相
对于 Web 应用程序根目录的路径,就可 以构建出定位资源的绝对路径。 Web 应用程序, 可以作为 Web 应用程序进行发布和运行。 但是, 我们也常常会以 JavaSE 的方式来运行 Web 应用程序的某个类的 main 方法。或者,使用 JUnit 测试。这都需要使用 JavaSE 的方式来运行。 这样,我们就无法使用 ServletContext.getRealPath("/")方法得到 Web 应用程序的根目录 的绝对路径。 而 JDK 提供的 ClassLoader 类, 它的 getResource(String name),getResourceAsStream(String name)等方法,使用相对于当 前项目的 classpath 的相对路径来查找资源。 读取属性文件
常用到的 ResourceBundle 类的 getBundle(String path)也是如此。 它们都只能使用相对路径来读取 classpath 下的资源, 无法定位到 classpath 外面的资源。 Classpath 外配置文件读取问题 如,我们使用测试驱动开发的方法,开发 Spring、Hibernate、iBatis 等使用配置文件的 Web 应用程序,就会遇到问题。 尽管 Spring 自己提供了 FileSystem(也就是相对于 user,dir 目录)来读取 Web 配置文件 的方法,但是终究不是很方便。而且与 Web 程序中的代码使用方式不一致! 至于 Hibernate,iBatis 就更麻烦了!只有把配置文件移到 classpath 下,否则根本不可能 使用测试驱动开发! 这怎么办?