向 Tomcat 类路径添加外部目录

我有一个文件夹在我的 C: 驱动器作为 C:\app_config\java_app 此文件夹包含一些区域设置特定的属性文件。

我有一个 java 类(PrjPropertilesLocator) ,它在 web 应用程序启动时根据默认语言环境加载属性文件。我的 web 应用程序在 tomcat 中运行。 问题是我应该如何在 tomcat 类路径中设置这个目录 C:\app_config\java_app,以便 PrjPropertilesLocator类中的 ResourceBundle 可以使用它。 有没有一种方法,我可以设置这个文件夹专门为一个单一的网络应用程序需要它。我不想把属性文件内的 WEB-INF/classes文件夹。

在 weblogic 上,这个运行得很好。我在 weblogic 类路径中的一个启动脚本中设置了目录,它运行得很好。 但是在 Tomcat 上,我尝试把它放在 startup.bat中,也放在 setclasspath.bat中,但是没有成功。

218031 次浏览

在 Tomcat 6中,您环境中的 CLASSPATH 被忽略

set CLASSPATH=%JAVA_HOME%\lib\tools.jar

然后在 Catalina.bat 里,就是这么用的

%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS%
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%"
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%"
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

我没有看到包含任何其他变量,所以我认为您只能编辑 setclassspath.bat 并更改 CLASSPATH 的构建方式。对于 Tomcat 6.0.20,这个更改发生在 setclassspath.bat 的74上

set CLASSPATH=C:\app_config\java_app;%JAVA_HOME%\lib\tools.jar

我建议您添加一个 META-INF目录,在. war 文件中包含一个 MANIFEST.MF文件。

请注意,根据 servlet 规范,它必须是。战争文件,而不是。War 目录,用于由容器读取的 META-INF/MANIFEST.MF

MANIFEST.MF Class-Path 属性编辑为 C:\app_config\java_app:

参见 使用 JAR 文件: 基础(理解清单)

好好享受吧。

只需在 /conf/catalina.propertiesshared.loadercommon.loader属性中指定它。

另见问题: 我可以在 Tomcat 中根据每个应用程序创建自定义类路径吗

根据 医生的部署描述符(<Context>标签中的内容) ,可以放置在:

  • $CATALINA_BASE/conf/server.xml-bad-需要重新启动服务器以重新读取配置
  • 坏-在所有应用程序中共享
  • 坏-需要重新打包,以改变配置
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml-不错,但请看最后一个选项! !
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml-不错,但请看最后一个选项! !
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml-最好的-完全出应用程序和自动扫描的变化! ! !

这里我的配置演示了如何使用 $CATALINA_BASE层次结构之外的项目文件的开发版本(注意,我将这个文件放入 src/test/resources目录,并指示 Maven 通过 pom.xml <filtering>true</filtering>预处理 ${basedir}占位符,所以在构建新环境之后,我将其复制到 $CATALINA_BASE/conf/Catalina/localhost/$APP.xml) :

<Context docBase="${basedir}/src/main/webapp"
reloadable="true">
<!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html -->
<Resources className="org.apache.naming.resources.VirtualDirContext"
extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
<JarScanner scanAllDirectories="true"/>


<!-- Use development version of JS/CSS files. -->
<Parameter name="min" value="dev"/>
<Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/>
<Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/>
</Context>

更新 的 Tomcat 8更改语法 <Resources><Loader>元素,对应的部分现在看起来像:

<Resources>
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>

您可以在 tomcat bin 目录中创建一个新文件 setenv.sh (或 setenv.bat) ,并在其中添加以下行

export CLASSPATH=$CLASSPATH:/XX/xx/PATH_TO_DIR

我可能有点晚了,但我遵循以下步骤,使其完全可配置使用 IntelliJ 的方式在 IDE 应用程序测试。我相信最好的方法是结合下面@BelusC 的回答。

1. run the application using IDE's tomcat run config.
2. ps -ef | grep -i tomcat //this will give you a good idea about what the ide doing actually.
3. Copy the -Dcatalina.base parameter value from the command. this is your application specific catalina base. In this folder you can play with catalina.properties, application root path etc.. basically everything you have been doing is doable here too.