Tomcat 7 Как ClassLoader загружается из двух веб-приложений, одной и той же иерархии пакетов / классов, разных классов?

У меня такой сценарий:

  1. //Tomcat7/webapps/app1/WEB-INF/classes/a/b/c/A.class
  2. //Tomcat7/webapps/app1/WEB-INF/classes/a/b/c/B.class
  3. //Tomcat7/webapps/app2/WEB-INF/classes/a/b/c/B.class (другой класс, но то же имя, что и ‹2>)
  4. //Tomcat7/webapps/app2/WEB-INF/classes/a/b/c/C.class

Примечание: иерархия каталогов классов такая же, отличается только файл класса.

Файл журнала для app1 содержит NoClassDefFoundError для A.class. Проверил каталог, файл класса определенно там. Теперь я пытаюсь выяснить, возможно ли, чтобы ClassLoader загружал только B.class, а не A.class, хотя должен быть ClassLoader для каждого веб-приложения, то есть два ClassLoader?

Есть идеи, как это работает?

РЕДАКТИРОВАТЬ: Tomcat7 запускается через Tanuki JWS. Из wrapper.log видно, что сначала инициализируется app2, а затем только app1.

С уважением, Аллан


person allancth    schedule 04.06.2014    source источник
comment
Если я хорошо помню, Tomcat управляет путем к классам для каждого приложения отдельно, поэтому класс из app1 не может быть скрыт классом с тем же именем из app2.   -  person lpratlong    schedule 04.06.2014
comment
Он работает, как описано в документации: tomcat.apache.org/tomcat-8.0 -doc / class-loader-howto.html   -  person Gimby    schedule 04.06.2014
comment
Будет ли это так же, если для запуска контейнера будет использоваться Tanuki JSW?   -  person allancth    schedule 04.06.2014
comment
Кажется, вы действительно склонны обвинять инструменты, которые используете. Я бы прекратил это, если у вас нет хотя бы некоторых доказательств того, что это может быть правдой, для вас больше в ваших интересах, чтобы это было чем-то, что вы лично делаете неправильно, чтобы вы могли это исправить. Приведу пример: вы проверили, существует ли файл A.class. Хорошо. Вы проверяли, больше ли он 0 байт?   -  person Gimby    schedule 04.06.2014
comment
Я не виню используемые инструменты. Я пытаюсь понять окружающую среду, влияют ли они друг на друга и как. Вот почему я спросил здесь, сталкивался ли кто с этим раньше. Если бы у меня были доказательства, я бы уже опубликовал их. И да, он больше 0 байт. Попытка декомпилировать класс сейчас, если видишь, что класс не поврежден или что-то в этом роде.   -  person allancth    schedule 04.06.2014
comment
Может ли быть случайно, что B.class также содержится в общих библиотеках Tomcat? Таким образом, стандартный загрузчик классов Tomcat загрузит B, но не загрузит A.   -  person Pavel S.    schedule 04.06.2014
comment
@PavelS Это может быть проблемой, если класс A или B находится в том же пакете, который, как я понимаю, уже был загружен. Поправьте меня, если я ошибаюсь.   -  person allancth    schedule 04.06.2014
comment
@allancth, вы правы, важно полное имя класса, это пакет + имя класса. В противном случае java.util.Date и java.sql.Date также были бы невозможны. Ваша ситуация действительно вызывает недоумение, если только банка с классом a / b / c / B. случайно не попала в общий загрузчик классов tomcat / lib.   -  person Gimby    schedule 20.06.2014
comment
@Gimby Да, это тоже меня озадачило. Но наш инженер службы поддержки сказал, что после перезапуска все работает нормально, поэтому я не собираюсь больше углубляться в это, так как сомневаюсь, что Tanuki JSW является основной причиной. Что ж, ура.   -  person allancth    schedule 20.06.2014


Ответы (1)


Эта проблема была решена после перезапуска Tomcat7. Основная причина не может быть идентифицирована.

person allancth    schedule 20.06.2014
comment
Возможно, веб-приложение было перезагружено, что может вызвать проблемы, особенно когда в игре присутствуют статические члены класса. - person Gimby; 22.06.2014