Добавление каталога в путь класса tomcat

У меня есть папка на моем диске C: C:\app_config\java_app Эта папка содержит некоторые файлы свойств, специфичные для локали.

У меня есть класс java (PrjPropertilesLocator), который загружает файлы свойств на основе языкового стандарта по умолчанию при запуске веб-приложения App.My, работающего внутри tomcat. Проблема в том, как установить этот каталог C:\app_config\java_app в пути класса tomcat, чтобы он стал доступным для ResourceBundle внутри класса PrjPropertilesLocator. Есть ли способ, которым я могу установить эту папку специально для одного веб-приложения, которое нуждается в ней. Я не хочу помещать файлы свойств в папку WEB-INF/classes.

В weblogic это выполняется отлично. Я устанавливаю каталог внутри пути classtextlog в одном из его сценариев запуска, и он отлично работает. Но на Tomcat я попытался поместить его в startup.bat также в setclasspath.bat, но не смог сделать это успешно.

Ответы

Ответ 1

Просто укажите его в shared.loader или common.loader свойстве /conf/catalina.properties.

Ответ 2

См. также вопрос: Могу ли я создать собственный путь к классам для каждого приложения в Tomcat.

Tomcat 7 Context удерживать Loader. Согласно docs дескриптор развертывания (что в теге <Context>) можно поместить в:

  • $CATALINA_BASE/conf/server.xml - bad - требуется перезагрузка сервера для перезаписи config
  • $CATALINA_BASE/conf/context.xml - плохой общий доступ во всех приложениях
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.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 dir и наследую 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>

Ответ 3

В 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 это изменение было похоже на 74 setclasspath.bat

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

Ответ 4

Я предлагаю вам добавить каталог META-INF с файлом MANIFEST.MF в .war файл.

Обратите внимание, что согласно спецификации сервлета, это должен быть файл .war, а не каталог .war для META-INF/MANIFEST.MF, который должен быть прочитан контейнером.

Измените свойство MANIFEST.MF Class-Path на C:\app_config\java_app:

См. Использование файлов JAR: основы (понимание манифеста)

Enjoy.

Ответ 5

Вы можете создать новый файл setenv.sh(или setenv.bat) внутри каталога bin tomcats и добавить следующую строку там

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