如何阅读战争外放置的属性文件?

时间:2011-06-01 12:45:56

标签: java web-applications java-ee properties

这些天我正在开发一个Web应用程序。那只使用jsps和servlet。这是一个小应用程序。现在我已将所有DataSource详细信息放在DAO实用程序类中。我想将这些细节放在一个可以置于战争之外的属性文件中,这样根据环境我们可以改变这些值,而不会影响战争。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:4)

使用上下文参数或java系统参数提供文件名。

1.Context Param

<context-param>
<param-name>daofilename</param-name>
<param-value>D:\daofilename.props</param-value>
</context-param>

2.系统参数

java -Ddao.filename=D:\daofilename.props server

答案 1 :(得分:4)

我就是这样做的:

将以下内容添加到context.xml文件(conf文件夹,在tomcat安装目录中)。你可以改变名字属性;并在值中设置您拥有属性文件的文件夹的路径。

<Environment name="config" value="C:\Program files\my app\"  
         type="java.lang.String" override="false"/>

然后在你的util类中,你可以得到这样的文件:(在“java:comp / env / config”中将'config'替换为你在context.xml中使用的“name”属性的值)

String folderName = null;
Properties properties = new Properties();
try {
   InitialContext context = new InitialContext();
   folderName = (String) context.lookup("java:comp/env/config");
} catch (NamingException ex) {
   System.out.println("exception in jndi lookup");
}
if(folderName != null) {
   File configFile = new File(folderName + "yourfile.properties");
   try {
       InputStream is = new FileInputStream(configFile);
       properties.load(is);
   } catch(IOException ex) {
      System.out.println("exception loading properties file");
   }
}

希望这可以帮助您或其他任何人。

答案 2 :(得分:2)

根据您的Web服务器,您可以将属性文件放在类路径中包含的某个位置。例如,对于某些tomcat版本,那将是${TOMCAT_BASE}/shared/classes。然后,webapp可以使用类似下面的内容来读取文件并在此位置自动找到它。

ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream("yourfilename.cnf");

您还可以在webapp的安装名称后命名该文件,并在从类路径加载文件时在代码中使用该名称。这样,您可以在共享目录中拥有多个Web应用程序的属性文件,而不会相互冲突。

您已经表明您无权访问ServletContext,因为您希望代码位于实用程序类中。解决此限制的一种方法是注册一个ServletContextListener,它创建属性文件阅读器的实例(因为它可以访问上下文)并注册它,以便其他代码可以使用它。如下所示:

public class MyServletContextListener extends ServletContextListener{
    public void contextInitialized(ServletContextEvent event){
        ServletContext context = event.getServletContext();
        context.setAttribute("settings", new MyPropertyReader(context));
    }

    public void contextDestroyed(ServletContextEvent event){}
    }

}

答案 3 :(得分:0)

您应该将属性文件位置作为Java运行时属性提供给Web容器..

如, java -DmypropertyFile.location=c:/propertyfile.properties -jar yourContainer.jar

答案 4 :(得分:0)

如果您使用的是Tomcat,则可以将您喜欢的任何属性添加到上下文中,查看documentation for context.xml。所有应用程序服务器都有自己的方法,所以你必须在JBoss,Glassfish等中查看这样做的例子。

另一个更难但可能更好的解决方案是使用JNDI resources

答案 5 :(得分:0)

我通常采用的方法是让程序假设配置文件位于%user.home%/.program/config.properties下。

如果找不到该文件(通常在首次运行时),则从“默认”配置文件的类路径创建一个副本并放在那里。

为了灵活性,这通常可以使用-Dconfig = somepath。

覆盖