Добавление каталога в classpath tomcat

У меня есть папка в моем диске 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 ответов

Решение

Просто укажите это в shared.loader или же common.loader собственностью /conf/catalina.properties,

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

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

  • $CATALINA_BASE/conf/server.xml - bad - требуется перезапуск сервера для перечитывания конфигурации
  • $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 Dir и 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>

ОБНОВЛЕНИЕ 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>

В 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

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

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

Изменить MANIFEST.MF Свойство Class-Path для C:\app_config\java_app:

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

Наслаждаться.

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

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

Возможно, я немного опоздаю на вечеринку, но я следую приведенным ниже инструкциям, чтобы сделать его полностью настраиваемым, используя способ 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. 
Другие вопросы по тегам