文档章节

spring配置文件路径和javaweb中项目的路径

writeademo
 writeademo
发布于 2016/04/07 23:21
字数 2445
阅读 197
收藏 1

Java代码  收藏代码

  1. org.springframework.core.io.supportClassPathMatchingResourcePatternResolver  

Java代码  收藏代码

  1. org.springframework.utilClass AntPathMatcher  

所有的配置官方说明请参照这两个类

在web.xml配置spring的配置文件

 

Xml代码  收藏代码

  1. <context-param>  

  2.         <param-name>contextConfigLocation</param-name>  

  3.         <param-value>这里写路劲</param-value>  

  4. </context-param>  

首先上几种写法(这个是spring的api复制的)

 

Java代码  收藏代码

  1. 1. /WEB-INF/*-context.xml 

  2. 2. com/mycompany/**/applicationContext.xml  

  3. 3. file:C:/some/path/*-context.xml 

  4. 4. classpath:com/mycompany/**/applicationContext.xml  

 

这些路径看起来很乱有木有

这里要说明一点,不要以为路径中的匹配符号是正则表达式(开始我是这样想的),这些符号的完整定义

----------------------------------------------------------------------

?    匹配一个任意字符   aa?  可以匹配  aa1  aab  但是不能匹配aa

*    匹配零个或者多个字符  aa* 可以匹配 aa1 aab  aa aaa

**  两个**不要以为是上面那个* 写两个的意思。 它的意思是匹配任意个路径 aa/**/bb  可以匹配aa/b/c/bb   aa/bb

aa  和bb之间可以个任意目录

----------------------------------------------------------------------

 

 

 

1.会查找到WEB-INF目录下的以"-context.xml"结尾的文件  在WEB-INF下的 a-context.xml b-context.xml都会被找到

2.com/mycompany/目录下所有的applicationContext.xml都会被找到

3.file 表示会根据文件系统的路径查找 这个条会找到 c盘下的/some/path目录以"-context.xml"的文件都会被找到

4.查找classpath下的com/mycompany/包中所有子包的applicationContext.xml文件

 

 

 

 

这个东西却是搞的有点复杂了。

 

 

完了吗 ? 还没有 还有 classpath*

 

 

 

classpath*:applicationContext.xml    classpath:applicationContext.xml 

区别是神马?classpath还有classpathaa或者classpathbb 不会呀,java只有classpath,那,那个*是神马意思。。。。 

好吧我告诉你

classpath*中的*并非 匹配零或者多个字符的那个*  (太乱了有木有)

classpath*是一种特殊的表示方法  ,它告诉spring找配置文件的时候WEB-INF/LIB中的jar文件也要找

classpath*:applicationContext.xml会找到所有jar文件根目录的applicationContext.xml文件,当然也包括classpath中的applicationContext.xml

这里有一点要注意  classpath*如果要在jar文件的根目录查找  就不能使用上面的那种模糊匹配,比如

classpath*:app*.xml 这样只能找到classpath下的app开头*.xml结尾的配置文件  效果和classpath:app*.xml一样,jar中的会被忽略

如果想查找jar中的配置文件就把配置文件放在jar文件的根目录下级下的目录(包括下级) 例如

jar文件中springConfig/applicationContext.xml springConfig/applicationAA.xml

可以使用 classpath*:springConfig/app*.xml找到这两个配置文件,总之要找到jar文件中的配置文件,还要使用模糊匹配,配置文件就应该在jar文件根目录除外的其他任何地方,然后根据路径名称模糊匹配即可找到

 

 

 

关于JAVA项目中CLASSPATH路径详解

在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候。classpath就是存放.class等编译后文件的路径。

javac 如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面 加上-classpath参数,通过使用以下三种类型的方法 来指导编译器在编译的时候去指定的路径下查找引用类。

(1).绝对路径:javac -classpath c:/junit3.8.1/junit.jar   Xxx.java
(2).
相对路径:javac -classpath ../junit3.8.1/Junit.javr  Xxx.java
(3).
系统变量:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%表示使用系统变量CLASSPATH的值进行查找,这里假设Junit.jar的路径就包含在CLASSPATH系统变量中)

javac 绝对路径的使用:

javac 假设你要编译的类文件名叫:HelloWorld.java,其完全路径为:D:/java/HelloWorld.java。但你所在的当前目录 是:C:/Documents and Settings/peng>。如果想在这里执行编译,会有什么结果呢?
 
(1).C:/Documents and Settings/peng> javac HelloWorld.java
这时编译器会给出如下的错误提示信息:
error: cannot read: HelloWorld.java
这是因为默认情况下javac是在当前目录下查找类文件,很明显这个路径不是我们存放类文件的地方,所以就会报错了
        
(2).C:/Documents and Settings/peng>javac D:/java/HelloWorld.java 

这时编译成功。
所以,只要你执行javac命令的目录不是类文件存放的目录,你就必须在javac命令中显式地指定类文件的路径。

java -classpath的使用:

java:假设我们的CLASSPATH设置为:D:/peng/java/pro ,在该目录下有三个文件:HelloWorld.java / HelloWorldExtendsTestCase / HelloWorldExtendsHelloWorld。这三个文件的类声明分别如下:

HelloWorld.java public class HelloWorld 
HelloWorldExtendsHelloWorld.java
public class HelloWorldExtendsHelloWorld extends HelloWorld
HelloWorldExtendsTestCase.java
public class HelloWorldExtendsTestCase extends junit.framework.TestCase 

      
假设我们已经按照上面关于javac -classpathjavac 绝对路径的使用,顺利地完成了三个文件地编译。现在我们在C:/Documents and Settings/peng>目录下执行这三个.class文件

(1).C:/Documents and Settings/peng>java  HelloWorld 
      Hello World


可以看到执行成功。为什么我们在 C:/Documents and Settings/peng>执行命令,JVM能够找到D:/peng/java/pro/HelloWorld.class文件呢?这是因为我们 配置了系统变量CLASSPATH,并且指向了目录:D:/peng/java/pro 。所以JVM会默认去该目录下加载类文件,而不需要指定.class文件的绝对路径了。
         
(2).C:/Documents and Settings/peng>java HelloWorldExtendsHelloWorld

       Hello World

可以看到执行成功了。HelloWorldExtendsHelloWorld继承了HelloWorld类,所以在执行时JVM会先查找在 CLASSPATH下是否存在一个HelloWorld.class文件,因为我们已经成功编译了HelloWorld 类了,所以可以成功执行 HelloWorldExtendsHelloWorld.class
  
(3).C:/Documents and Settings/peng>java HelloWorldExtendsTestCase
     Exception in thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase

可以看到程序抛出异常了,提示找不到junit.framework.TestCase文件。为什么同样在:/peng/java /pro 下,HelloWorldExtendsHelloWorld.class就可以成功执行,而这个就不行了呢?这是因 为:            junit.framework.TestCase.class文件并不存在于当前目录下,所以为了能够让程序成功运行,我们必须通过指定 CLASSPATH的方式,让JVM可以找到junit.framework.TestCase这个类,如(4)
(4). C:/Documents and Settings/peng>java -classpath %CLASSPATH% HelloWorldExtendsTestCase
      Hello World

总结:
(1).何时需要使用-classpath:当你要编译或执行的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过-classpath来引入类
(2).何时需要指定路径:当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时,就需要指定源文件的路径(CLASSPATH是用来指定.class路径的,不是用来指定.java文件的路径的) 

 

JAVA获取classpath路径:

ClassLoader 提供了两个方法用于从装载的类路径中取得资源:

        public URL  getResource (String name);  
        public InputStream
  getResourceAsStream (String name);  

      
这里name是资源的类路径,它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。
       但是真正使用的不是ClassLoader的这两个方法,而是Class getResourcegetResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,不 过根据JDK文档的说法,Class对象的这两个方法其实是委托delegate)给装载它的ClassLoader来做的,所以只需要使用 Class对象的这两个方法就可以了。

       因此,直接调用  this.getClass().getResourceAsStream(String name) ;获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream (String name) ;

      下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

1.this.getClass().getResource"" 
得到的是当前类class文件的URI目录。不包括自己!
如:file/D/workspace/jbpmtest3/bin/com/test/

2.
this.getClass().getResource"/" 
得到的是当前的classpath的绝对URI路径 
如:file/D/workspace/jbpmtest3/bin/

3.
this.getClass() .getClassLoader().getResource"" 
得到的也是当前ClassPath的绝对URI路径 
如:file/D/workspace/jbpmtest3/bin/

4.
ClassLoader.getSystemResource"" 
得到的也是当前ClassPath的绝对URI路径 
如:file/D/workspace/jbpmtest3/bin/

5.
Thread.currentThread().getContextClassLoader ().getResource"" 
得到的也是当前ClassPath的绝对URI路径 
如:file/D/workspace/jbpmtest3/bin/

6.
ServletActionContext.getServletContext().getRealPath(“/”) 
Web应用程序 中,得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
如:file/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject


注意点:

1.尽量不要使用相对于System.getProperty"user.dir")当前用户目录的相对路径。这是一颗定时炸 弹,随时可能要你的命。

2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URIURLFile对象。

3. 尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResourceString relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource"")方法得到当前classpath的绝对路径。如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

获得CLASSPATH之外路径的方法:
URL base = this.getClass().getResource""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/  
      String path = new File
base.getFile(), "……/……/……/"+name.getCanonicalPath(); //就可以得到/home/popeye/testjava/name

另外,如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

 

PS:以上内容很多来自转载和自己的部分总结。

 

 

 

 

本文转载自:http://name327.iteye.com/blog/1628884

上一篇: svn连接问题
下一篇: mysql安装问题
writeademo
粉丝 25
博文 632
码字总数 229415
作品 0
东城
私信 提问
关于spring获得路径问题

@卖蜡笔的小新 你好,想跟你请教个问题: 你好,之前请教过spring获得项目运行路径的问题,您当时教我是这样配置 webAppRootKey web.root org.springframework.web.util.WebAppRootListener 代...

ForTheFree
2016/10/08
254
2
spring的使用

在前边的文章中说明了,如何搭建一个spring的开发环境,简单回顾下就是把spring的jar包导入工程中,如果是在javaWeb项目中是放在lib目录下,然后在web.xml文件中进行配置,配置spring的配置文...

wf王帆
2016/08/01
9
0
Java开发框架搭建:配置文件

工欲善其事,必先利其器。我们知道,Java开发最难的部分,就是初期框架的搭建工作。本文将记录一个可用的Java开发框架的搭建过程,以期满足大多数Java项目的开发。 本项目采用Maven管理Jar包...

纠结名字
2015/08/13
974
0
搭建与测试Spring开发环境

1、Spring需要的jar 到http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下。 spring.jar commons-logging.jar 如果使用了切面编...

罗荣熙
2012/09/27
275
0
web.xml 配置applicationContext.xml

web.xml中classpath:和classpath*: 有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. 有时候会用模糊匹配的方...

binhu
2014/08/06
248
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部