jetty guice illegalaccessError

Ste*_* B. 2 java jetty guice

我在我的应用程序中运行独立的jetty时看到奇怪的行为.

启动应用程序会引发错误:

2011-12-14 16:46:20.634:WARN ::启动处理程序时出错java.lang.IllegalAccessError:类sun.reflect.GeneratedConstructorAccessor2无法在sun.misc.Unsafe.defineClass(Native Method)访问其超类sun.reflect.ConstructorAccessorImpl

这是由线路触发的

if(f.getAnnotation(Persist.class)!= null)// f是一个Field实例(公共实例,不少),Persist是一个注释

一些有趣的事实

  • 代码在tomcat中运行良好

  • 代码在ant skty任务中运行良好

  • 代码在独立码头上抛出此错误(尝试过v6和v8),即使我使用运行jetty ant任务的相同jetty jar运行它.

使用最小的jetty.xml运行(基本上只是指向一个目录).

Ste*_* B. 6

因为我刚刚遇到这个,并且因为它看起来有点......模糊不清,所以认为值得发布,因为任何其他可怜的灵魂都会遇到这个看似随意的行为.

这里看到一条消息,相关的引用是

问题是AOP代理类是在单独的类加载器中生成的,这是可见性问题的原因,因为从其他类加载器看不到包私有类型.Guice尝试检测这一点以避免引入单独的类加载器,但这似乎不会在您的示例中发生.

因此,如果我将所有应用程序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>
Run Code Online (Sandbox Code Playgroud)