将外部目录添加到Tomcat类路径

75

我在C:驱动器上有一个名为C:\app_config\java_app的文件夹,其中包含一些区域特定的属性文件。

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

在Weblogic上,这可以正常运行。我在其中一个启动脚本中设置了Weblogic类路径中的目录,并且它可以正常工作。 但是,在Tomcat上,我尝试将其放置在startup.batsetclasspath.bat中,但未能成功执行。


1
仅需阅读此链接 http://www.chemaxon.com/jchem/doc/admin/tomcat.html 即可得知,tomcat不使用系统类路径。我将C:/app_config/java_app文件夹中的所有文件复制到<tomcat install>/lib文件夹中,它可以正常工作了。看起来tomcat没有使用系统类路径。我们能否在tomcat的启动文件中设置C:\app_config\java_app文件夹? - Rajat
2
http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html - jack
6个回答

133
只需在 /conf/catalina.properties 文件的 shared.loadercommon.loader 属性中指定即可。

15
请问是否有办法使用命令行参数来指定其中任何一个?如果可以的话,这将非常方便,因为我无需修改任何Tomcat文件就可以实现此操作... - Matthias Hryniszak
4
我已经花了数小时寻找这个解决方案。再一次,BalusC 又成功地解决了问题。 - Rhys
1
人们可能会对了解Tomcat类路径-常见问题及其解决方法感兴趣,因为这是一篇非常相关的文章。 - Dawngerpony
8
回答没有针对主要需求:“是否有一种方法可以将此文件夹专门设置为需要它的单个Web应用程序。” - Derek Mahar
2
这不是一个解决方案。两个应用程序可能使用相同的配置文件名称,因此为了安全起见,应用程序必须拥有自己独特的类路径。 - jacekn
显示剩余6条评论

31

参考问题:如何在Tomcat中为每个应用程序创建自定义类路径

Tomcat 7的Context元素包含Loader元素。根据文档,部署描述符(位于<Context>标签内)可以放置在以下位置:

  • $CATALINA_BASE/conf/server.xml - 不好 - 需要重新启动服务器才能重新读取配置
  • $CATALINA_BASE/conf/context.xml - 不好 - 在所有应用程序之间共享
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml - 不好 - 需要重新打包才能更改配置
  • $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目录中,并通过pom.xml中的<filtering>true</filtering>指令告诉Maven预处理${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>

有人有这个工作的例子吗?我们已经玩了一段时间,但是还没有能够正确地将东西添加到应用程序的类路径中。 - Skeeterdrums

13
在Tomcat 6中,您的环境变量中的CLASSPATH会被忽略。在setclasspath.bat文件中,您会看到:
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%

我没有看到任何其他被包含的变量,所以我认为您只能编辑setclasspath.bat并更改构建CLASSPATH的方式。对于Tomcat 6.0.20,此更改位于setclasspath.bat的第74行。

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

6
我建议您在 .war 文件中添加一个 META-INF 目录,并包含一个 MANIFEST.MF 文件。请注意,根据 Servlet 规范,容器只会读取 .war 文件中的 META-INF/MANIFEST.MF,而不是文件夹。
编辑 MANIFEST.MF 的 Class-Path 属性为 C:\app_config\java_app
参考 使用 JAR 文件:基础知识(了解清单) 祝使用愉快。

嗯,对我来说它不起作用。请注意源代码中的提示:您可能需要从JAR文件中引用其他类。这种方法可能适用于jar,但不适用于我的Web应用程序。 - WesternGun

3
您可以在Tomcat的bin目录下创建一个名为setenv.sh(或setenv.bat)的新文件,并在其中添加以下行。
export CLASSPATH=$CLASSPATH:/XX/xx/PATH_TO_DIR

0

我可能有点晚来参加这个派对,但是我按照以下步骤使用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. 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接