Вы должны понимать, что загрузчик классов не может видеть все; они могут видеть только то, что загрузил родительский загрузчик классов или что они загрузили сами. Поэтому, если у вас есть два загрузчика классов, скажем, один для Jetty, а другой для вашего веб-приложения, ваше веб-приложение может видеть log4j (поскольку JAR - это WEB-INF / lib), а загрузчик классов Jetty - нет.
Если вам удастся сделать класс доступным для Jetty (например, что-то на уровне БД), который использует log4j, но в конечном итоге работает в контексте (и загрузчике классов) Jetty, вы получите ошибку.
Чтобы отладить это, установите точку останова в org.springframework.web.util.Log4jWebConfigurer.initLogging (). Если вы можете, скопируйте исходный код этого класса в свой проект (не забудьте впоследствии удалить его) и добавьте следующую строку:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Посмотрите на объект cl в вашем отладчике. Это должно дать вам некоторую информацию, кто его создал. Я предполагаю, что это загрузчик классов от Jetty.
[EDIT] Обратите внимание, что вы попадаете в другой беспорядок, если у вас есть log4j в обоих загрузчиках классов: в этом случае у вас будет два класса с одинаковым именем, которые создают объекты которые не совместимы с назначением! Поэтому убедитесь, что существует только один экземпляр этого jar, или что экземпляры log4j никогда не будут передаваться между двумя контекстами (что обычно невозможно).