Jar в библиотеке Tomcat не может увидеть файл свойств в моем веб-приложении - PullRequest
2 голосов
/ 16 августа 2011

Недавно я разделил основные функциональные возможности моего основного приложения сервлетов в файл jar. Этот jar-файл теперь развернут в папке lib tomcat, и приложение (например, servlets, jsps, properties properties..etc) развернуто независимо как файл war.

Для файлов jar требуются специальные файлы свойств. Я помещаю эти файлы свойств прямо в папку "src" (то есть в верхнюю часть иерархии классов) в файле war.

В прошлом, когда все было в одном проекте и развернуто в одном военном файле. Файлы свойств были доступны для связанных классов. Теперь, когда эти классы развернуты в jar, они не могут видеть файлы свойств, расположенные в файле war (то есть развернутое веб-приложение).

Чего мне здесь не хватает? Пример того, как я загружаю свои файлы proeprties:

properties.load(getClass().getResourceAsStream("/appconfig.properties"));

Спасибо, что уделили время.

Ответы [ 2 ]

9 голосов
/ 16 августа 2011

Вы не должны получать его собственным загрузчиком классов.Поскольку класс теперь управляется Tomcat, он знает только о внутренних ресурсах Tomcat, а не о ресурсах, специфичных для веб-приложений.Вы должны получить его с помощью загрузчика классов контекста текущего потока.Этот загрузчик классов знает обо всех ресурсах, выделенных для текущего веб-приложения.

properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("appconfig.properties"));

Независимо от этого правильное расположение такого файла свойств, представляющего глобальную конфигурацию приложения, не будет находиться внутри файла WAR.Лучше поместить файл свойств по фиксированному пути вне Tomcat и файла WAR, а затем добавить этот фиксированный путь к свойству shared.loader /conf/catalina.properties Tomcat, чтобы он стал частью пути к классам.Это позволяет свободно редактировать файл конфигурации без необходимости перестраивать / повторно развертывать всю WAR.Обратите внимание, что вам все же необходимо использовать загрузчик классов для загрузки контекста.

1 голос
/ 16 августа 2011

Да, это не сработает, потому что файлы jar в папке lib tomcat загружаются другим загрузчиком классов, который ничего не знает о классах вашего веб-приложения.Другими словами, tomcat lib является загрузчиком родительского класса загрузчика классов веб-приложения (который создается по одному для каждого веб-приложения).

Если вы хотите, чтобы он работал, вы можете либо поместить файл свойств во внешнее местоположениеи сообщите об этом банке внутри библиотеки Tomcat через абсолютный путь к файлу или поместите банку обратно в библиотеку веб-приложения.

Вот несколько ссылок с сайта Tomcat.

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

Как правило, переменные среды используются для идентификации $ CATALINA_HOME, который затем будет добавляться к относительному пути к файлу, чтобы избежать жесткого кодирования абсолютных путей.

String catalinaHome = System.getProperty("CATALINA_HOME");
properties.load(new FileInputStream(new File(catalinaHome + "/path/to/appconfig.properties")));
...