Добавление каталога в classpath tomcat - PullRequest
66 голосов
/ 19 августа 2009

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

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

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

Ответы [ 5 ]

122 голосов
/ 08 декабря 2009

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

27 голосов
/ 30 сентября 2014

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

Tomcat 7 Контекст удерживать Загрузчик элемент. В соответствии с документами дескриптор развертывания (что в теге <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 - best - полностью вне приложения и автоматически сканируется на наличие изменений !!!

Здесь мой конфиг, который демонстрирует, как использовать версию разработки файлов проекта из иерархии $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>
13 голосов
/ 19 августа 2009

В 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
5 голосов
/ 25 августа 2009

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

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

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

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

Наслаждайтесь.

2 голосов
/ 16 марта 2016

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

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