WebApproot в Spring
Получаю это сообщение об ошибке
[SEVERE: Событие инициализации отправки исключений для экземпляра слушателя класса org.springframework.web.util.Log4jConfigListener java.lang.IllegalStateException: системное свойство корневого веб-приложения уже установлено в другое значение: 'webapp.root' = [C:\Users\jaanlai\Documents\NetBeansProjects\absSovellus\build\web] вместо [C:\Users\Administrator\Documents\NetBeansProjects\keycard2\build\web] - выберите уникальные значения для контекстного параметра 'webAppRootKey' в ваших файлах web.xml!
Это странно, потому что у меня нет каких-либо webAppRootKey, определенных в моих файлах. Что это?
Ответы
Ответ 1
webAppRootKey
- это параметр контекста, который Spring использует в нескольких местах. В этом случае он используется Log4jWebConfigurer
. Он предоставляет root webapp как системное свойство, которое может использоваться в конфигурационных файлах log4j, примерно так:
log4j.appender.testfile.File=${webapp.root}/WEB-INF/testlog.log
Вы использовали бы это, если бы по какой-то причине захотели найти ваши журналы относительно вашего корня webapp.
Проблема, с которой вы сталкиваетесь, заключается в том, что некоторые контейнеры (в частности, Tomcat) не поддерживают сопоставление свойств системы на основе webapp. Если вы не укажете webAppRootKey
, Spring по умолчанию будет webapp.root
. Поскольку вы используете два приложения в одном контейнере, второе приложение, которое вы пытаетесь запустить, показывает, что webAppRootKey
уже установлен (по умолчанию) и выдает ошибку. В противном случае параметр webAppRootKey
будет установлен неверно, и вы можете получить журналы из одного webapp в другом webapp.
Вы можете указать другой webAppRootKey
с использованием параметров контекста в вашем web.xml
, например:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webapp.root.one</param-value>
</context-param>
и
log4j.appender.testfile.File=${webapp.root.one}/WEB-INF/testlog.log
в вашем log4j. Это должно позаботиться о конфликте.
Ответ 2
<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
...
Это решило проблему для меня. Кредит: -
http://forum.springsource.org/archive/index.php/t-32873.html
Ответ 3
Похоже, что у вас есть несколько webapps с настройкой по умолчанию Log4jConfigListener
на вашем сервере приложений.
Поведение по умолчанию для Log4jConfigurationListener
заключается в том, чтобы открыть webapp root как системное свойство с именем webapp.root
, чтобы вы могли использовать его при указании мест в файлах журнала. Однако, если системное свойство с тем же именем уже существует, оно генерирует исключение.
Вы можете настроить имена приложений для этого системного свойства с помощью <context-param>
с именем webAppRootKey
или отключить отображение свойства системы, установив Log4jConfigListener
<init-param>
с именем log4jExposeWebAppRoot
на false
.
См. также:
Ответ 4
На всякий случай кто-то еще сделал это, не избавившись от проблемы:
У нашего webapp был установлен webAppRootKey правильно, но я все еще получил исключение выше. Перезагрузив Glassfish и переделав один и тот же файл войны, перейдите к рисунку.
Ответ 5
Если вы используете logback
вместо log4j
и получаете ту же ошибку, это решает:
<context-param>
<param-name>logbackExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>