所以我确定Tomcat 7的工作目录默认为$ CATALINA_BASE / bin
我获得了一个jar(在已部署的webapp中运行),该代码运行在不读取外部属性文件的代码上,这是Tomcat 7的推荐方法。该代码最初用于Weblogic,并且仍然在那里使用。< / p>
它以这种方式打开文件:
FileInputStream fis = new FileInputStream("AXFLogger.properties");
我知道Tomcat推荐的方式是:
InputStream is = getClass().getClassLoader().getResourceAsStream("AXFLogger.properties");
无论如何问题不在于代码应该是什么,问题是改变代码可能真的有问题,因为它已经老了,我可能需要离岸团队为我重写它。
我熟悉workDir Tomcat属性,但这似乎是一个全局Tomcat设置,这是一个问题。我希望它仅适用于单个webapp。显然,将webapp的属性文件存储在Tomcat的bin目录中是一个坏主意。
所以我想知道是否有人对此解决方法有任何想法?我需要这个来帮助降低更改代码可能不可行的风险。感谢
答案 0 :(得分:1)
无法更改每个Web应用程序的working directory。该进程有一个“工作目录”,根据您使用的服务器软件(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秒内修复它。