Да, это потому, что серверы приложений Java EE имеют иерархию загрузчиков классов, которая выглядит примерно так: сначала вызывается загрузчик классов начальной загрузки; Далее идет загрузчик классов уровня EAR, затем загрузчик классов уровня WAR. Загрузчики классов более высокого уровня не будут искать нужные классы ниже. Если они не найдут то, что им нужно, будет сгенерировано исключение ClassNotFoundException.
Таким образом, файлы JAR в WEB-INF / lib не были видны загрузчику классов уровня EAR. Когда вы перемещаете эти банки вверх, вы решаете проблему. Это делает все эти JAR-файлы видимыми и для всех WAR в вашем EAR.
Одна вещь, которую вы, возможно, захотите проверить, - это спецификация для вашего web.xml и других файлов. Спецификации сервлетов и JSP менялись где-то по пути, поэтому JAR, такие как JSTL и другие, перешли с версии 1.0 на 1.1. Возможно, вы захотите тщательно проверить ваш web.xml и все JAR-файлы, чтобы убедиться, что они соответствуют спецификациям, поддерживаемым вашим сервером приложений Java EE.
К сожалению, обновить сервер приложений не так просто, как подключить EAR или WAR.