java - 为每个 webapp 设置 Tomcat 7 工作目录?

标签 java tomcat

所以我确定Tomcat 7的工作目录默认是$CATALINA_BASE/bin

我获得了一个 jar(在已部署的 webapp 中运行),它运行在不以 Tomcat 7 的推荐方式读取外部属性文件的代码上。该代码最初是为 Weblogic 而设计的,现在仍然在那里使用。

它以这种方式打开文件:

FileInputStream fis = new FileInputStream("AXFLogger.properties");

我知道 Tomcat 的推荐方式是这样的:

InputStream is = getClass().getClassLoader().getResourceAsStream("AXFLogger.properties");

无论如何,问题不在于代码应该是什么,问题是更改代码可能真的有问题,因为它很旧,我可能需要一个离岸团队为我重写它。

我熟悉 workDir Tomcat 属性,但这似乎是一个全局 Tomcat 设置,这是一个问题。我希望它仅适用于单个网络应用程序。显然将 webapp 的属性文件存储在 Tomcat 的 bin 目录中是一个坏主意。

所以我想知道是否有人对此有任何解决方法?我需要它来帮助减轻更改代码可能不可行的风险。谢谢

最佳答案

无法更改 working directory对于每个 Web 应用程序。该进程有一个“工作目录”,更改它可能会出现问题,具体取决于您使用的服务器软件(Tomcat 本身不关心,但其他应用程序服务器(例如 Weblogic)可能会关心)。

在 Tomcat 下运行时,每个应用程序都有自己的“工作”目录:如果您获取上下文属性的值 javax.servlet.context.tempdir , 你会发现一个 java.io.File指向特定上下文工作目录的实例。

不幸的是,当像这样打开一个文件时:

FileInputStream in = new FileInputStream("myfile");

只有上述两个概念中的第一个在起作用:文件将从进程的当前工作目录加载。

您可以尝试在启动 Tomcat 时设置工作目录,但它仅适用于单个应用程序(如果您有多个应用程序,其行为如上所述)。以下是您的操作方式:

$ cd path/to/web/application
$ $CATALINA_HOME/bin/startup.sh

这会将工作目录设置为 path/to/web/application . Tomcat 不会更改该工作目录。

如果您有多个应用程序都以这种方式运行,解决该问题的一种方法是简单地启动多个 Tomcat 进程——每个 Web 应用程序一个——位于它们自己的工作目录中。当然,您需要一个前端的反向代理来根据 URL 模式(或其他)将客户端请求代理到正确的 Tomcat 后端,但是为了稳定性和容错性,您可能应该有一个反向代理, 无论如何。

如果您可以访问源代码,实际上最好按照您在原始帖子中的建议对其进行修改(尽管使用前导 / 只是为了精确)。更好的是,也许使用 servlet 或上下文 <init-param>指定文件的位置,以防您想将其移动到其他地方。为此目的修改源代码不需要与某些离岸公司进行长期合作……只需去编辑文件并在 30 秒内修复它。

关于java - 为每个 webapp 设置 Tomcat 7 工作目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285628/

相关文章:

java - 如何从请求 servlet 生成图像

java - 如何遍历每一行,计算差异然后对所有内容进行平均?

Tomcat 的 server.xml 宿主容器和 Varnish

tomcat安装异常

maven - 无法在基于 Maven 的客户端服务器应用程序中的浏览器上加载 UI 组件

java - 当 URL 路径中有特殊字符时,将 Apache ProxyPass 或 Mod_jk 与 Tomcat 结合使用

java - Maven 捆绑插件 : Export has private references

java - 将动态 XML/JSON 内容与静态标记化负载进行比较并检索标记值

Java LDAP - TCP RST 和套接字句柄泄漏

java - jar 中的类什么时候进入 PermGen