2017-10-13 92 views
0

我发布了几个与javassit链接错误spring Exception when running application on WebSphere with java 8有关的问题。现在经过一些关于这个主题和错误的研究后,我已经获得了一些有关Javassist的字节码操作以解决链接错误的有用信息。如何使用Javassist进行字节码操作来解决链接错误?

供您参考(已贴在这里的另一个问题,该堆栈跟踪)

[10/13/17 ] 00000089 webapp  E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet                  Error]-[weblge]: java.lang.ExceptionInInitializerError 
     at java.lang.J9VMInternals.ensureError(J9VMInternals.java:134) 
     at java.lang.J9VMInternals.recordInitializationFailure(J9VMInternals.java:123) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:83) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:437) 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:120) 
     at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:345) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:278) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103) 
     at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1826) 
     at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:442) 
     at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88) 
     at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:171) 
     at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:904) 
     at com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:789) 
     at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:427) 
     at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:719) 
     at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1247) 
     at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1514) 
     at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:704) 
     at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:1096) 
     at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:799) 
     at com.ibm.ws.runtime.component.ApplicationMgrImpl$5.run(ApplicationMgrImpl.java:2315) 
     at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5488) 
     at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5614) 
     at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255) 
     at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2320) 
     at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:436) 
     at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123) 
     at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:379) 
     at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access$500(CompositionUnitMgrImpl.java:127) 
     at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:985) 
     at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:524) 
     at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1909) 
Caused by: java.lang.IllegalStateException: javassist.CannotCompileException: by java.lang.LinkageError: org.springframework.aop.framework.ProxyCreatorSupport 
     at org.springframework.aop.framework.JavassistApplicationContext.<clinit>(JavassistApplicationContext.java:36) 
     ... 34 more 
Caused by: javassist.CannotCompileException: by java.lang.LinkageError: org.springframework.aop.framework.ProxyCreatorSupport 
     at javassist.ClassPool.toClass(ClassPool.java:1170) 
     at javassist.ClassPool.toClass(ClassPool.java:1113) 
     at javassist.ClassPool.toClass(ClassPool.java:1071) 
     at javassist.CtClass.toClass(CtClass.java:1275) 
     at org.springframework.aop.framework.JavassistApplicationContext.<clinit>(JavassistApplicationContext.java:34) 
     ... 34 more 
Caused by: java.lang.LinkageError: org.springframework.aop.framework.ProxyCreatorSupport 
     at java.lang.ClassLoader.defineClassImpl(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:357) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:293) 
     at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
     at java.lang.reflect.Method.invoke(Method.java:508) 
     at javassist.ClassPool.toClass2(ClassPool.java:1183) 
     at javassist.ClassPool.toClass(ClassPool.java:1164) 
     ... 38 more 

和我对这个Java文件收到此错误,当我试图做操作org.springframework.aop.framework.ProxyCreatorSupport

package org.spring.aop.framework; 

import javassist.ClassPool; 
import javassist.CtClass; 
import javassist.CtConstructor; 
import javassist.LoaderClassPath; 
import org.springframework.web.context.support.XmlWebApplicationContext; 

public class JavassistApplicationContext extends XmlWebApplicationContext { 

    static { 
     ClassPool classPool = ClassPool.getDefault(); 
     try { 
      ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
      classPool.appendClassPath(new LoaderClassPath(classLoader)); 

      CtClass cc = classPool.get("org.spring.aop.framework.ProxyCreatorSupport"); 
      CtConstructor c = cc.getConstructors()[0]; 
      c.insertAfter("$0.aopProxyFactory = new org.spring.aop.framework.JavassistAopProxyFactory();"); 
      cc.toClass(); 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 
} 

就行cc.toClass();,我得到这个例外。我在WebSphere上尝试了不同的类加载器方法来解决此异常并获得相同的错误。

现在我明白,linkage problem is occur when tries to modify the class already loaded by referenced classloader .能够解决这个错误,我should unload the class first from the reference classloader,我认为这是困难的。

  1. 所以我认为唯一的方法来解决这个问题,通过任何类加载器之前的类加载器实现字节码操作。是不是?
  2. 如何将我现有的代码更改为使用java代理的字节码操作?任何想法和建议?请不要把它作为一个重复的问题。这只是上一个问题的参考工作。
+0

有什么建议吗? –

回答

1

您需要编写a Java agent并动态附加它以在加载时转换类。你可以找到一个很酷的教程here,解释如何做到这一点。

请注意,此方法允许您在JVM加载它时拦截类,并在实际完成此加载后对其进行修改。

+0

此检测过程将解决“由于类加载器导致的链接错误”? –

+0

我认为这可能会因为这将修改你的类,而他们正在加载,而不是当他们已经加载。通过这个过程,我构建了一个软件,可以对目标软件的每个库进行测试,我从来没有遇到过错误。只需试一试 – rakwaht

+0

好的谢谢。我想在现有的代码中添加这个工具支持。我在/ WEB_INF/lib路径上使用了Javassit库。因为我的代码已经和我在一起,我想知道是否应该只添加Java代理代码或其他任何额外的东西。 –