将目录添加到tomcat类路径

Raj*_*jat 67 tomcat classpath

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

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

在weblogic上运行正常.我在其中一个启动脚本中设置了weblogic类路径中的目录,它工作正常.但在Tomcat我试图把它startup.bat还在setclasspath.bat,但没能成功地这样做.

Bal*_*usC 123

只需指定它shared.loadercommon.loader属性/conf/catalina.properties.

  • 我想知道是否有办法使用命令行参数指定其中任何一个.它非常方便,因为我没有必要修改任何Tomcat文件才能工作...... (11认同)
  • 答案没有解决关键要求:"有没有办法可以专门为需要它的单个Web应用程序设置此文件夹." (6认同)
  • 我花了几个小时寻找这个解决方案.BalusC再次成功. (4认同)
  • 人们可能会对 [Understanding The Tomcat Classpath - Common Problems And How To Fix Them](https://www.mulesoft.com/tcat/tomcat-classpath) 作为一篇很棒的相关文章感兴趣。 (2认同)
  • 这不是解决方案。两个应用程序可能使用相同的配置文件名,因此应用程序必须有自己唯一的类路径才能安全。 (2认同)

gav*_*koa 27

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

Tomcat 7 Context hold Loader元素.根据docs部署描述符(<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和intruct 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>
Run Code Online (Sandbox Code Playgroud)

更新 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>
Run Code Online (Sandbox Code Playgroud)


Tre*_*ton 13

在Tomcat 6中,将忽略您环境中的CLASSPATH.在setclasspath.bat中你会看到

set CLASSPATH=%JAVA_HOME%\lib\tools.jar
Run Code Online (Sandbox Code Playgroud)

然后在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%
Run Code Online (Sandbox Code Playgroud)

我没有看到任何其他包含的变量,所以我认为你很难编辑setclasspath.bat并改变CLASSPATH的构建方式.对于Tomcat 6.0.20,此更改与setclasspath.bat中的74一样

set CLASSPATH=C:\app_config\java_app;%JAVA_HOME%\lib\tools.jar
Run Code Online (Sandbox Code Playgroud)


Koe*_*box 5

我建议你做的是在.war文件中添加一个META-INF带有MANIFEST.MF文件的目录.

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

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

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

请享用.