我在我的应用程序中运行独立的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运行(基本上只是指向一个目录).
因为我刚刚遇到这个,并且因为它看起来有点......模糊不清,所以认为值得发布,因为任何其他可怜的灵魂都会遇到这个看似随意的行为.
在这里看到一条消息,相关的引用是
问题是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)