在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