Проблема с веб-приложением Spring 3.1

Я разрабатывал простое приложение Spring mvc с одним контроллером. при развертывании файла войны я получаю следующее исключение.

java.lang.IllegalAccessError: tried to access class org.springframework.core.convert.support.StringToBooleanConverter from class org.springframework.core.convert.support.DefaultConversionService
    at org.springframework.core.convert.support.DefaultConversionService.addScalarConverters(DefaultConversionService.java:61)
    at org.springframework.core.convert.support.DefaultConversionService.addDefaultConverters(DefaultConversionService.java:53)
    at org.springframework.core.convert.support.DefaultConversionService.<init>(DefaultConversionService.java:42)
    at org.springframework.core.env.AbstractPropertyResolver.<init>(AbstractPropertyResolver.java:44)
    at org.springframework.core.env.PropertySourcesPropertyResolver.<init>(PropertySourcesPropertyResolver.java:42)
    at org.springframework.core.env.AbstractEnvironment.<init>(AbstractEnvironment.java:95)
    at org.springframework.core.env.StandardEnvironment.<init>(StandardEnvironment.java:54)
    at org.springframework.web.context.support.StandardServletEnvironment.<init>(StandardServletEnvironment.java:43)
    at org.springframework.web.servlet.HttpServletBean.<init>(HttpServletBean.java:90)
    at org.springframework.web.servlet.FrameworkServlet.<init>(FrameworkServlet.java:211)
    at org.springframework.web.servlet.DispatcherServlet.<init>(DispatcherServlet.java:303)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

1 ответ

Это звучит как проблема с загрузчиком классов. Я сталкивался с этим раньше, когда столкнулся с конфликтами, возникающими из-за загрузки в MyEclipse разных файлов jar вместо тех, которые, как я думал, были загружены приложением!

Один из способов проверить это - запустить Process Explorer и посмотреть файлы jar, которые загружены в память и где они были созданы.

Чтобы получить более конкретную информацию об ошибке, которую вы получаете, я приведу цитату из спецификации JVM 7, в которой перечислены именно эти ошибки в 5.4.3.1.

5.3. Создание и загрузка

Во время выполнения класс или интерфейс определяется не только своим именем, но и парой: его двоичным именем (§4.2.1) и определяющим загрузчиком класса. Каждый такой класс или интерфейс принадлежит одному пакету времени выполнения. Пакет времени выполнения класса или интерфейса определяется по имени пакета и определяющему загрузчику класса класса или интерфейса.

5.4.3.1. Разрешение класса и интерфейса

Чтобы разрешить неразрешенную символическую ссылку из D в класс или интерфейс C, обозначенный N, выполняются следующие шаги:

Загрузчик определяющего класса D используется для создания класса или интерфейса, обозначенного N. Этот класс или интерфейс - C. Детали процесса приведены в §5.3.

Любое исключение, которое может быть сгенерировано в результате сбоя при создании класса или интерфейса, может быть выброшено в результате сбоя при разрешении класса и интерфейса.

Если C является классом массива, а его тип элемента является ссылочным типом, то символическая ссылка на класс или интерфейс, представляющий тип элемента, разрешается путем рекурсивного вызова алгоритма в §5.4.3.1.

Наконец, права доступа к C проверяются: если C недоступен (§5.4.4) для D, разрешение класса или интерфейса вызывает ошибку IllegalAccessError.

Это условие может возникнуть, например, если C является классом, который первоначально был объявлен как общедоступный, но был изменен на непубличный после компиляции D.

Если шаги 1 и 2 выполнены успешно, но шаг 3 не выполнен, C все еще действителен и пригоден для использования. Тем не менее, разрешение не удается, и D запрещен доступ к C.

Подводя итог, кажется, что jar из другого пакета, то есть из другого загрузчика классов.

Другие вопросы по тегам