【问题标题】:How to read properties file placed outside war?如何读取放置在战争之外的属性文件?
【发布时间】:2011-09-06 06:41:28
【问题描述】:

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

【问题讨论】:

  • 我必须修改属性文件中的属性。想要将属性文件放置在相对于 WAR 的路径中。我无权访问 dev 和 prod 框。此外,我不想在 Servlet 级别读取属性文件,我想在负责提供数据源的实用程序类中读取它。 ServletContext 和 all 仅在 servlet 级别可用。
  • 更新了我的答案以解决您的评论。

标签: java web-applications jakarta-ee properties


【解决方案1】:

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

1.上下文参数

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

2.系统参数

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

【讨论】:

  • 但是,属性文件位置又取决于战争。您应该更改战争文件以更改属性文件位置。
  • 如果我是正确的,要求是更改文件中的道具,而不是文件本身。
  • @Gursel Koca 如果是这样的话,即使是系统参数也需要在运行脚本文件中进行更改
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    如果您使用的是 Tomcat,您可以将任何您喜欢的属性添加到上下文中,请查看 documentation for context.xml。所有应用程序服务器都有自己的方式来执行此操作,因此您必须四处寻找在 JBoss、Glassfish 等中执行此操作的示例。

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        您已表明您无权访问 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){}
            }
        
        }
        

        【讨论】:

          【解决方案6】:

          我就是这样做的:

          将以下内容添加到 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");
             }
          }
          

          希望这对您或其他人有所帮助。

          【讨论】:

          • 这个答案对我帮助很大。大家不要忘记关闭输入流。
          猜你喜欢
          • 2011-12-16
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 2015-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-05
          相关资源
          最近更新 更多