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


69

我的C:驱动器中有一个文件夹,因为C:\app_config\java_app 该文件夹包含一些特定于语言环境的属性文件。

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

在weblogic上,它运行良好。我在weblogic类路径中的启动脚本之一中设置了目录,并且运行良好。但是在Tomcat上,我也尝试将其放入startup.batsetclasspath.bat,但未能成功完成。


1
只需阅读此链接chemaxon.com/jchem/doc/admin/tomcat.html,即tomcat不使用系统类路径。我将所有文件从C:/ app_config / java_app复制到<tomcat install> / lib文件夹中,并且可以正常工作。看起来tomcat不使用系统类路径,我们可以在其中一个tomcats启动文件中设置文件夹C:\ app_config \ java_app。
拉贾特

Answers:


127

只需在中指定shared.loadercommon.loader属性即可/conf/catalina.properties


12
我想知道是否有一种方法可以使用命令行参数来指定其中的任何一个。这将非常方便,因为我无需修改任何Tomcat文件即可运行...
Matthias Hryniszak 2012年

4
我已经花了几个小时寻找这种解决方案。BalusC再次通过。
Rhys

1
人们可能会对理解Tomcat类路径-常见问题以及如何解决它们感兴趣,是一篇很棒的相关文章。
Dawngerpony 2015年

7
答案不能满足关键要求:“有没有一种方法可以专门为需要该文件夹的单个Web应用设置此文件夹。”
德里克·马哈

1
这不是解决方案。两个应用程序可能使用相同的配置文件名,因此,应用程序必须具有自己的唯一类路径才能安全。
jacekn

28

另请参阅问题:我可以在Tomcat中基于每个应用程序创建自定义类路径吗?

Tomcat 7上下文保留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/resourcesdir并插入Maven以预处理${basedir}占位符,pom.xml <filtering>true</filtering>因此在新环境中构建后,将其复制到$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>

UPDATE 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%

我没有看到任何其他var,所以我认为您在编辑setclasspath.bat和更改CLASSPATH的生成方式方面遇到了麻烦。对于Tomcat 6.0.20,此更改类似于setclasspath.bat的74

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

5

我建议您做的是在.war文件中添加META-INF包含MANIFEST.MF文件的目录。

请注意,根据servlet规范,META-INF/MANIFEST.MF容器必须读取.war文件,而不是.war目录。

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

请参阅使用JAR文件:基础知识(了解清单)

请享用。


好吧,这对我不起作用。请注意以下来源:您可能需要从JAR文件中引用其他JAR文件中的类。该方法可能适用于jar,但不适用于我的Web应用程序。
WesternGun

2

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

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

0

我参加聚会可能有点晚,但是我按照以下步骤使用IntelliJ的in-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. 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.