Справочная информация + Проблема
В прошлом был собственный веб-проект Eclipse Dynami c, который был перенесен в Gradle. С тех пор мой веб-интерфейс больше не может выполняться должным образом во встроенном Tomcat Eclipse, используя те же наборы Tomcat- и launch-config, что и раньше. Я вижу, что некоторые части моего веб-интерфейса успешно выполняются, но в какой-то момент ClassNotFoundException
запускается и все перестает работать.
Отлажено это с помощью ProcMon и пришел к выводу, что все JAR-файлы, доступные в \.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\de.am_soft.sm_mtg.frontend\WEB-INF\lib
, развернутые для встроенного (!) Tomcat, успешно прочитаны. Но в какой-то момент файлы JAR, хранящиеся в этом каталоге и необходимые позже, больше не используются. Вместо этого мне нужно добавить отсутствующие зависимости в classpath файла launch-config, связанного со встроенным Tomcat, перезапустить и все снова начинает работать до тех пор, пока не будет пропущена следующая зависимость, и ее нужно будет добавить.
Единственное другое решение, которое я нашел, - это добавление зависимостей в путь к классам проекта при развертывании во встроенный Tomcat, и это именно то, что было сделано в прошлом с собственным проектом Eclipse. Именно это и делает Gradle при создании файлов проекта для Eclipse, но по причинам, не относящимся к этой проблеме, у меня есть несколько вариантов использования, в которых Gradle НЕ добавляет эти зависимости в путь к классам проекта, используемый Tomcat.
Старый и новый конфигурации запуска для встроенного Tomcat
против
Что заставляет меня задуматься
Журналы ProcMon совершенно ясно показывают, что некоторые из моих собственных JAR-файлов моего собственного программного обеспечения хранятся в WEB-INF\lib
и читаются оттуда в какой-то момент. То же самое верно для сторонних библиотек, таких как SLF4J, например, можно прочитать в следующих строках:
20:02:25,8492518 javaw.exe 15684 CreateFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8493029 javaw.exe 15684 CloseFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8494953 javaw.exe 15684 ReadFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8495221 javaw.exe 15684 QueryStandardInformationFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8495409 javaw.exe 15684 ReadFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8495614 javaw.exe 15684 ReadFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8495959 javaw.exe 15684 ReadFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8496269 javaw.exe 15684 ReadFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8496463 javaw.exe 15684 ReadFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8497129 javaw.exe 15684 CloseFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8500387 javaw.exe 15684 QueryNetworkOpenInformationFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
20:02:25,8500583 javaw.exe 15684 CloseFile [...]\WEB-INF\lib\slf4j-api-1.7.25.jar SUCCESS
Но в некоторых моментах эти JAR больше не используются, а вместо этого только путь к классу конфигурации запуска для встроенный Tomcat считается. Если я добавлю отсутствующие JAR-файлы, они будут использоваться в любом месте, откуда я их добавил. Если я не добавляю что-то, там выдаются исключения, как в случае SLF4J:
20:03:23,9387918 javaw.exe 15684 CreateFile [...]\Documents\Eclipse\Java Sm-Mtg bug_2590_gradle\de.am_soft.sm_mtg.parser.oms.search\bin\test\de\am_soft\util\api\conf\Conf.class PATH NOT FOUND
20:03:23,9388307 javaw.exe 15684 ReadFile [...]\Documents\Repos\Ivy\de.am_soft.util\api\0.1.0\api.jar SUCCESS Offset: 2.674, Length: 160
[...]
20:03:23,9443769 javaw.exe 15684 CloseFile [...]\Documents\Repos\Ivy\de.am_soft.util\api\0.1.0\api.jar SUCCESS
20:03:23,9451049 javaw.exe 15684 CreateFile [...]\Documents\Eclipse\Java Sm-Mtg bug_2590_gradle\de.am_soft.sm_mtg.api\bin\main\org\slf4j\LoggerFactory.class PATH NOT FOUND
Важно отметить, что с помощью строк выше, api
загружается из позиции, отличной от WEB-INF\lib
хотя это было доступно там все время и не должно было привести к исключению вообще по моему мнению. То же самое для SLF4J, он больше не читается с WEB-INF\lib
вместо прежнего, и, поскольку я не добавил его к пути к классу конфигурации запуска вручную, он не был найден во время этого теста.
Вопросы
Какие пути к классам используются Tomcats, встроенными в Eclipse во время выполнения? * Используется 1044 *
WEB-INF\lib
, используется путь к классу конфигурации запуска, путь к классам модуля развертывание, кажется, используется ... Но все ли они используются в одно и то же время в течение срока службы Tomcat в теории, или по какой-то причине все меняется в какой-то момент? Я пытаюсь понять, откуда это может исходить, что в какой-то момент WEB-INF\lib
, похоже, больше не используется. По какой-то причине это может быть что-то, что мешает самим классовым путям, а в настройках проекта может быть что-то иное, говорящее Tomcat, что он ведет себя по-другому по сравнению с ...
Спасибо!