2017-10-13 18 views
0

javassit linkage error 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エージェントコードを追加するか追加するかを知りたがっています。 –

関連する問題