Как найти спрятанную банку в classpath? - PullRequest
1 голос
/ 11 октября 2011

У меня есть веб-приложение с Spring, Hibernate и Struts 2, и я получаю эту ошибку:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoSuchFieldError: TRACE

Так что я гуглил это, нашел это , которое говорит:

если вы используете консоль Equinox, выполните следующую проверку: пакетов org.apache.log4j

Что я и сделал, и получил это:

org.apache.log4j; version="1.2.15"<org.apache.log4j_1.2.15.v201005080500 [33]>
  org.apache.velocity_1.5.0.v200905192330 [37] imports

И я действительно не знаю, что это значит ... Но в чем я уверен, так это в том, что я НЕ должен использовать банку.

Фактически я выполнил команду пакетов после того, как удалил все файлы jar log4j в проекте и в библиотеках Tomcat.

И даже после удаления jar log4j я все еще могу импортировать класс org.apache.log4j.Level в любой класс в моем проекте (и, конечно, тот класс Level, который я могу импортировать, не имеет поля TRACE).

Итак, как мне найти, где это? И как это входит в мой classpath проекта ???

Спасибо за ваше время!

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Попробуйте найти местоположение банки, вызвавшей проблему:

System.out.println(org.apache.log4j.Level.class.getProtectionDomain().getCodeSource().getLocation());
0 голосов
/ 11 октября 2011

Аргумент jvm '-verbose' или '-verbose: class' будет выводиться на консоль для каждого класса, из которого он загружен (в большинстве случаев это jar). Возможно, это доступно вам (в зависимости от того, как вы запускаете веб-приложение).

Для log4j имейте в виду, что многие люди отправляют log4j со своей банкой. В идеале они должны изменить имя пакета, если они это делают, но некоторые этого не делают. Я написал / собрал следующий bash-скрипт, чтобы найти, какой jar-файл имел log4j:

for file in *.jar
do
    unzip -l "$file" 2> /dev/null | grep "log4j.dtd" && echo $
done

Это ищет log4j.dtd, который я искал (не стесняйтесь заменять любым классом log4j), а затем печатает путь в zip-файле и после этого имя zip-файла, который его содержит. Просто запустите его из каталога со всеми вашими банками.

...