Java jetty guice Illegalacesserror
我在独立jetty上运行的应用程序中看到了奇怪的行为 启动应用程序会引发错误: 2011-12-14 16:46:20.634:警告::启动处理程序时出错 java.lang.IllegalAccessError:class sun.reflect.GeneratedConstructorAccessor2无法访问其超类 sun.reflect.ConstructorAccessorImpl位于 sun.misc.Unsafe.defineClass(本机方法) 这是由该行触发的 如果(f.getAnnotation(Persist.class)!=null)//f是一个字段实例(一个公共实例,不少于), Persist是一个注释 一些有趣的事实Java jetty guice Illegalacesserror,java,jetty,guice,Java,Jetty,Guice,我在独立jetty上运行的应用程序中看到了奇怪的行为 启动应用程序会引发错误: 2011-12-14 16:46:20.634:警告::启动处理程序时出错 java.lang.IllegalAccessError:class sun.reflect.GeneratedConstructorAccessor2无法访问其超类 sun.reflect.ConstructorAccessorImpl位于 sun.misc.Unsafe.defineClass(本机方法) 这是由该行触发的 如果(f.ge
- 代码在tomcat中运行良好
- 代码在ant jetty任务中运行良好
- 该代码在独立jetty(尝试了v6和v8)上抛出此错误,即使我使用运行jetty ant任务的相同jetty JAR运行它
使用最小的jetty.xml运行(基本上只是指向一个目录)。因为我刚刚遇到了这个,而且它似乎有点。。。默默无闻,我认为这是值得张贴的任何其他可怜的灵魂运行到这个似乎随机行为相同的坑 看到一条消息,相关引用如下 问题是AOP代理类是在一个单独的环境中生成的 类加载器,这是可见性问题的原因,因为包私有类型是 从其他类装入器看不到。Guice试图检测到这一点,以避免引入 单独的类加载器,但在您的示例中似乎没有发生这种情况 因此,如果我将所有的app jar直接转储到JETTY_HOME/lib中,那么我的应用程序就会工作,这显然会导致aop以guice认可的方式生成类 更正-事实证明,这与guice无关,而是与Jetty加载类的方式有关。实际修复方法是改变jetty加载类的方式,将其添加到jetty.xml webappcontext定义中:
<Set name="handler">
<New class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="parentLoaderPriority">true</Set>
真的
我在嵌入式Jetty和@Async注释中遇到了类似的问题。我通过强制Jetty的类加载器与我的应用程序的类加载器相同来解决这个问题:
context.setClassLoader(Thread.currentThread().getContextClassLoader());
以下是完整的代码:
public class Jetty {
public static Server createServer(int port) {
Server server = new Server(port);
WebAppContext context = new WebAppContext();
context.setResourceBase("src/main/webapp");
context.setClassLoader(Thread.currentThread().getContextClassLoader());
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{context});
server.setHandler(handlers);
return server;
}
}