2017-04-19 8 views
1

bytebuddyホームページのサンプルに基づいて、簡単なJavaエージェントを作成しようとしています。私はエージェントを動作させましたが、OSGIの実行時にそれを実行すると、java.lang.NoClassDefFoundErrorがスローされます。bytebuddy with osgi container

任意のポインタ?

java.lang.ClassNotFoundException: com.foo.javaagent.TimingInterceptor cannot be found by .. 

import net.bytebuddy.agent.builder.AgentBuilder; 
import net.bytebuddy.implementation.MethodDelegation; 
import net.bytebuddy.matcher.ElementMatchers; 
import java.lang.instrument.Instrumentation; 


    public class TimerAgent { 
     public static void premain(String arguments, 
            Instrumentation instrumentation) { 
      new AgentBuilder.Default() 
        .type(ElementMatchers.nameEndsWith("World")) 
        .transform((builder, type, classLoader, module) -> 
          builder.method(ElementMatchers.any()) 
            .intercept(MethodDelegation.to(TimingInterceptor.class)) 
        ).installOn(instrumentation); 
     } 
    } 

答えて

0

TimingInterceptorクラスは、あなたのインストルメントクラスによって参照されているので、見えなければなりません。 OSGiは、クラス・ローダーによってクラスを分離し、システム・クラス・ローダーをエージェントがロードされる親として設定しません。これを回避するには、クラスを普遍的な目に見えるブートストラップクラスローダーに注入する必要があります。これを行うには、別のjarファイルで隔離ロジックを分離し、エージェントをインストールするために使用するInstrumentationインスタンス経由でこのjarをブートストラップクラスローダ検索パスに接続します。エージェントをインストールする前に実行する必要があります。

+0

ラファエル - 迅速に対応いただきありがとうございます。あなたはすばらしい図書館を作っています。私はそれを働かせることができました。 Method入力パラメータ、byte buddyを持つHTTPインターセプタを変更する方法の例はありますか? – basu76

関連する問題