在web项目里面,有时代码里面须要引用一些自定义的配置文件,这些配置文件若是放在类路径下,项目通过打包后使用的相对路径也会发生变化,因此如下给出了三种解决方案。
1、properties下配置web
在类路径下定义config.properties
,内容为:spring
name=zhangsan
在xml配置server.propertiesapp
<util:properties id="config" location="classpath:conf/config.properties"/>
在service类里注入:eclipse
@Value("#{config['name']}") private String name;
二:在properties下配置webapp
在类路径classpath
下定义config.properties
this
name=zhangsan
在xml里配置spa
<!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:config/*.properties" /> </bean> <bean id = "config" class = "com.util.Config"> <property name="name" value = "${name}" /> </bean>
com.util.Config里内容code
import org.springframework.core.io.Resource; public class Config { private Resource resource; public Resource getResource() { return resource; } public void setResource(Resource resource) { this.resource = resource; } }
调用方法:server
//此处name为自定义bean的id @Resource(name = "config") protected Config config; protected String configPath; protected String getConfigPath() { if (StringUtils.isEmpty(name)) { try { name = config.getResource().getFile().getAbsolutePath(); return configPath; } catch (IOException e) { e.printStackTrace(); } } return configPath; }
3、经常使用的方式xml
ClassLoader 提供了两个方法用于从装载的类路径中取得资源:
public URL getResource (String name); public InputStream getResourceAsStream (String name);
这里name是资源的类路径,它是相对与"/"
根路径下的位置。getResource获得的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序能够从正确的位置抽取数据。可是真正使用的不是ClassLoader的这两个方法,而是Class的getResource和getResourceAsStream方法,由于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