Как отследить JAR с поврежденным индексом JAR, вызывающим InvalidJarIndexException в Tomcat в Eclipse - PullRequest
2 голосов
/ 08 мая 2011

Я работаю над разработкой приложения, которое, помимо прочего, содержит ряд сервлетов.Средой разработки, которую я использую, является Eclipse (3.2.1, которая довольно старая), в которой я запускаю сервер Tomcat (5.5.23, также довольно старый), используя плагин Eclipse Tomcat Wrapper для этой задачи.Все это работает в системе RedHat 5.2 Linux.

Я использую среду выполнения Java - JDK 1.6.0 (21), которую я обновил до предыдущей версии JDK 1.5 (насколько я могу).Напомним, что вышеприведенная комбинация программного обеспечения (вместе с приложением, с которым я работаю) действительно работала: я мог запустить сервер Tomcat, он встал без ошибок и жалоб, а сервлеты приложения были доступны через порт 8080.

Однако что-то где-то изменилось (может быть в самих jarfiles приложений, я подозреваю, что по сути все на хосте является основной причиной этого).Теперь, когда я пытаюсь запустить сервер Tomcat, я получаю ошибку sun.misc.InvalidJarIndexException в выводе консоли.Это происходит для следующих классов и методов:

  • org.apache.commons.modeler.Registry registerComponent (происходит 3 раза)
  • org.apache.catalina.core.StandardServer initialize (происходит один раз)
  • org.apache.catalina.connector.Connector start (происходитдважды)

Я нашел этот вопрос переполнения стека о том, как найти JAR Java-класса полезным, и я несколько раз запускал find /usr -name \*name-of-suspected-jar\*.jar, чтобы отследить числоиз предложенных оскорбительных банок.Я также попытался проверить конфигурацию времени выполнения сервера Tomcat в Eclipse, но на самом деле не мог сопоставить файлы JAR в системе с CLASSPATH ни с установкой времени выполнения Tomcat (или с CLASSPATH, используемым в среде при запускеЗатмение). Это усилие, вероятно, требует от меня большей строгости, но прежде чем сделать это (и именно поэтому я прямо сейчас не публикую все ужасные подробности, касающиеся CLASSPATH s здесь), я прочиталименно то, о чем на самом деле InvalidJarIndexException.

Итак, файлы JAR могут содержать необязательный файл INDEX.LIST, который содержит информацию о том, какие классы (и методы?) найти в файле JAR.Идея состоит в том, чтобы замкнуть поиск во всех JARS в CLASSPATH, что полезно в ряде обстоятельств.Проблема в том, что файл INDEX.LIST оказывается поврежденным (или считается поврежденным), что приводит к тому, что загрузка класса полностью прекращается (загрузчик классов не возвращается к поискувсе файлы JAR в CLASSPATH) и ошибка InvalidJarIndexException, которая должна быть выброшена.Чтобы сделать вещи более беспорядочными, порядок, в котором ищутся JAR, может повлиять на то, как загрузчик классов обрабатывает файл INDEX.LIST: файл INDEX.LIST одного JAR может ссылаться на другие JARS, и если те, которые ссылаются на JARS, не синхронизированы спервый файл JAR INDEX.LIST, загрузчик классов завершается с ошибкой InvalidJarIndexException.

Итак (согласно этот StackOverflow вопрос), похоже, что эта ошибка может быть вызвана не толькопоскольку файл JAR имеет поврежденный INDEX.LIST, кажется, что его даже можно выбросить в JAR, даже если JAR имеет действительный INDEX.LIST или законно отсутствует INDEX.LIST просто потому, что ранее найденный JAR запутал загрузчик классов,(Другими словами, как это ни странно, это исключение может быть выдано даже для «невинных» не поврежденных JAR-файлов из-за нарушителей в другом месте системы).

Итак, после написания простого романа, здесьприходит мой основной набор вопросов:

  • Каков наилучший способ отследить точный файл .jar, для которого выбрасывается каждый InvalidJarIndexException?
  • Каков наилучший способпроверить, имеет ли случайно выбранный файл .jar файл INDEX.LIST и, если да, является ли указанный файл действительным (то есть не поврежденным)?Какие инструменты существуют для этой задачи?
  • Существует ли эффективный способ автоматического определения порядка поиска файлов .jar?Я могу попытаться следовать CLASSPATH вручную, но, честно говоря, подвержен ошибкам и утомителен.
  • Существует ли эффективный способ выяснить, какой файл .jar присутствует в порядке поиска, что может запутать загрузчик классов, чтобы обвинить невинные, не поврежденные файлы .jar на более поздних этапах поиска в наличии неправильных файлов INDEX.LIST?

Отказ от ответственности: я знаю, что я запускаю старые версии программного обеспечения (даже если у меня установлены последние обновления моего Redhat 5.2, хотя), и я знаю, что реакция коленного рефлекса для многих людей заключается в том, чтобы предложить мне не прилагает какие-либо усилия для отладки этого, но вместо этого обновите его до более поздней версии Tomcat, Eclipse и Linux (хотя Java является последней).Причина, по которой я предпочел бы не делать этого, заключается в том, что после изучения вещей я обнаружил, что делать обновление или пытаться установить отдельный современный Tomcat или Eclipse рядом с RHEL5.2, предоставленным Tomcat / Eclipse, который я использую сегодня, довольно сложно.Кроме того, я считаю, что такого рода устранение неполадок дает возможность узнать некоторые полезные подробности о Java и связанных с ней инструментах и ​​функциях.Выяснение того, как работает загрузка классов и что вызывает ее выброс InvalidJarIndexException в моей системе, будет очень обучающим!

(Но если это устранение неполадок не удастся, я серьезно подумаюиспользовать современный Linux, Eclipse и Tomcat ... обещаю)

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Выполните следующие шаги для диагностики проблемы:

  1. Добавить точку прерывания исключения в Eclipse (это J с значок восклицательного знака), и установите его, чтобы остановить для пойманных и не пойманных исключения типа InvalidJarIndexException .
  2. Начните отладку вашей программы.

Eclipse остановится на вашей точке прерывания исключения, когда будет выброшено InvalidJarIndexException . Даже без источника для URLClassPath вы все равно сможете проверять переменные в стеке, приводящие к исключению, включая имя класса, который URLClassPath пытается найти. Знание имени класса должно значительно сузить список JAR-файлов, которые вы должны изучить.

Возможно, вы локально добавили новый класс в пакет, и содержимое этого пакета описывается индексным файлом в устаревшем JAR-файле вашего пути к классам?

1 голос
/ 07 сентября 2011

Попробуйте Tattletale , который является хорошим инструментом отчетности для банок. В этом случае я поочередно удалял INDEX.LIST из банок, пока я больше не получил InvalidJarIndexException

...