2017-10-13 11 views
0

J'ai posté plusieurs questions liées à javassit erreur de liaison spring Exception when running application on WebSphere with java 8. Maintenant, après quelques travaux de recherche autour de ces sujets et de l'erreur, j'ai quelques informations utiles sur la manipulation de bytecode avec Javassist pour résoudre l'erreur de liaison.Comment faire une manipulation de bytecode avec Javassist pour résoudre les erreurs de liaison?

Pour votre référence (déjà posté cette trace de pile dans une autre question ici)

[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 

et je reçois cette erreur sur ce fichier java, quand je suis en train faire l'opération sur 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); 
     } 
    } 
} 

sur la ligne cc.toClass();, je reçois cette exception. J'ai essayé différentes méthodes de chargeur de classes sur WebSphere pour résoudre cette exception et obtenir la même erreur.

Maintenant, j'ai compris que linkage problem is occur when tries to modify the class already loaded by referenced classloader . être en mesure de résoudre cette erreur, je should unload the class first from the reference classloader et je pense que c'est difficile.

  1. Donc je pense que la seule méthode pour résoudre cela avec l'implémentation de la manipulation de bytecode avant le chargeur de classe par n'importe quel chargeur de classe. n'est pas?
  2. Comment changer mon code existant en manipulation de bytecode avec l'agent java? Une idée et une suggestion? s'il vous plaît ne pas mettre comme une question en double. Ceci est seulement le travail de référence de la question précédente.
+0

Des suggestions? –

Répondre

1

Vous devez écrire a Java agent et l'attacher dynamiquement pour transformer une classe au moment du chargement. Vous pouvez trouver un tutoriel cool here qui explique comment le faire.

Notez que cette méthode vous permet d'intercepter la classe pendant qu'elle est chargée par la machine virtuelle Java et de la modifier après que ce chargement est réellement effectué.

+0

Ce processus d'instrumentation résoudra les "erreurs de liaison dues au chargeur de classe"? –

+0

Je pense que cela pourrait modifier vos classes pendant qu'elles sont chargées et non quand elles sont déjà chargées. Avec ce processus, j'ai construit un logiciel qui instrumentait chaque classe de chaque bibliothèque d'un logiciel cible et je n'ai jamais eu votre erreur. Essayez-le – rakwaht

+0

ok merci. Je veux ajouter ce support d'instrumentation sur mon code existant. J'utilise des librairies Javassit sur le chemin/WEB_INF/lib. parce que j'ai mon code déjà avec moi et je veux savoir si je devrais ajouter seulement le code d'agent de Java en plus ou n'importe quoi supplémentaire. –