我需要使用容器application.properties
从 servlet 应用程序中读取文件。Tomcat
该文件不能包含在我的文件中,war
因此它不能Tomcat
以任何方式位于 webapps 或根文件夹下。该文件必须位于文件夹中的某个位置。我也不能FileInputStream
用来读取属性文件。我唯一的选择是JNDI
为文件夹/目录定义一个名称,并JNDI
在运行时查看该属性以找到读取文件的文件夹位置。你有任何可行的例子吗?
2 回答
阅读以下类似的帖子和文章,我为自己制定了一个解决方案。
使用 JNDI 从 tomcat 读取全局变量。示例不起作用
我在 \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 代码中硬编码我的文件夹位置,这使我的应用程序更便携。
对于类似的问题,我的方法略有不同。我也玩弄了 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/classes
appserver/lib
JRE/lib
如果属性文件是特定于 webapp 的,最好将它放在
WEB-INF/classes
. 如果您在 IDE 中开发项目,您也可以将其放在 src 文件夹(项目的源文件夹)中。您也可以将其放在默认类路径之外的某个位置,并将其路径添加到应用服务器的类路径中。例如在 Tomcat 中,您可以将其配置
shared.loader
为tomcat/conf/catalina.properties
.
我希望这有帮助。
艾伦