4

我正在用一个控制器开发简单的 spring mvc 应用程序。当我部署war文件时,出现以下异常。

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)
4

1 回答 1

0

这听起来像一个类加载器问题。当我遇到 MyEclipse 加载不同的 jar 文件而不是我认为由应用程序加载的那些文件时,我遇到过这种情况!

一种检查方法是运行Process Explorer并查看加载到内存中的 jar 文件以及它们的来源。

为了更具体地了解您遇到的错误,我引用了JVM 7 规范,该规范列出了 5.4.3.1 中的确切错误:

5.3. 创建和加载

在运行时,一个类或接口不仅仅由其名称决定,而是由一对:它的二进制名称(第 4.2.1 节)和它的定义类加载器决定。每个这样的类或接口都属于一个运行时包。类或接口的运行时包由包名和定义类或接口的类加载器决定。

5.4.3.1。类和接口解析

要将未解析的符号引用从 D 解析到由 N 表示的类或接口 C,执行以下步骤:

D的定义类加载器用于创建一个用N表示的类或接口。这个类或接口是C。过程的细节在§5.3中给出。

因此,由于类或接口创建失败而引发的任何异常都可能因类和接口解析失败而引发。

如果 C 是一个数组类并且它的元素类型是一个引用类型,那么通过递归调用 §5.4.3.1 中的算法来解析对表示元素类型的类或接口的符号引用。

最后,检查对 C 的访问权限: 如果 C 对 D 不可访问(第 5.4.4 节),则类或接口解析会引发 IllegalAccessError。

例如,如果 C 是一个最初声明为公共但在编译 D 后更改为非公共的类,则可能会发生这种情况。

如果步骤 1 和 2 成功但步骤 3 失败,则 C 仍然有效且可用。然而,解析失败,D被禁止访问C。

总而言之,听起来 jar 来自不同的包,即来自另一个类加载器。

于 2015-01-31T17:08:34.640 回答