3

我需要使用容器application.properties从 servlet 应用程序中读取文件。Tomcat该文件不能包含在我的文件中,war因此它不能Tomcat以任何方式位于 webapps 或根文件夹下。该文件必须位于文件夹中的某个位置。我也不能FileInputStream用来读取属性文件。我唯一的选择是JNDI为文件夹/目录定义一个名称,并JNDI在运行时查看该属性以找到读取文件的文件夹位置。你有任何可行的例子吗?

4

2 回答 2

3

阅读以下类似的帖子和文章,我为自己制定了一个解决方案。

上下文容器

使用 JNDI 从 tomcat 读取全局变量。示例不起作用

java:comp/env 未绑定

我在 \conf\Catalina\localhost\mywebapp.xml 下为我的 Web 应用程序定义了一个环境,如下所示......

    <Environment name="propertiesfilelocation" value="E:\\tmp\\application.properties"
     type="java.lang.String" override="false"/>

然后使用 JNDI 查找访问我的属性文件以获取文件名。

   Context ctx  = new InitialContext();
   Context envCtx = (Context)ctx.lookup("java:comp/env");
   String propertiesFileLocation = (String) envCtx.lookup("propertiesfilelocation");
   LOGGER.info("String property === " + propertiesFileLocation);

   properties.load(new FileInputStream(propertiesFileLocation));

@home:是的,你是对的,它涉及 FileInputStream。但是,我对解决方案感到满意,因为我不再在 Java 代码中硬编码我的文件夹位置,这使我的应用程序更便携。

于 2013-10-12T16:26:33.127 回答
1

对于类似的问题,我的方法略有不同。我也玩弄了 JNDI 的想法,但我发现这有点矫枉过正。

我找到了 BalusC 的另一篇文章。它允许您指定相对于您的 tomcat 安装的文件夹并在那里部署您的所有属性文件。因此,您将配置保留在应用程序外部,但您不需要为每个应用程序的每个属性文件单独配置。

这里是链接: 在哪里放置以及如何在基于 servlet 的应用程序中读取配置资源文件?

首选如下:

将它放在类路径中,以便您可以 ClassLoader#getResourceAsStream()使用类路径相对路径加载它:

Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties"));

这里filename.properties应该放置在 webapp 的默认类路径所覆盖的根目录之一中, 例如webapp/WEB-INF/lib,或.webapp/WEB-INF/classesappserver/libJRE/lib

如果属性文件是特定于 webapp 的,最好将它放在 WEB-INF/classes. 如果您在 IDE 中开发项目,您也可以将其放在 src 文件夹(项目的源文件夹)中。

您也可以将其放在默认类路径之外的某个位置,并将其路径添加到应用服务器的类路径中。例如在 Tomcat 中,您可以将其配置shared.loadertomcat/conf/catalina.properties.

我希望这有帮助。

艾伦

于 2014-09-02T08:50:32.800 回答