14

ドメイン オブジェクトをセットアップしようとして@Configurableいます (Spring コンテナーによって管理されていません)。
を JVM 引数として追加することでこれを機能させましたが-javaagent:path/to/spring-instrument.jar、この -javaagent を配置する必要があるかどうかは 100% 明確ではありません。これをTomcat 8で実行しています。ドキュメントを誤解している可能性がありますが、これを達成するために別のメカニズム、特に次の行を使用できるようです。

TomcatInstrumentableClassLoaderon 以上は定義しないでくださいTomcat 8.0。代わりに、Springが戦略InstrumentableClassLoaderを通じて Tomcat の新しいネイティブ機能を自動的に使用できるようにします。TomcatLoadTimeWeaver

以下のコードサンプル:

@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }   
    @Bean
    public MyService myService(){
        return new MyService();
    }
}

@Configurable
public class MyDomainObject {

    @Autowired
    private MyService myService;

    public MyService getMyService(){
        return myService;
    }
}

 public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void test(){
        log.info("test");
    }
}

-javaagent を指定せずにこれらの @Configrable オブジェクトを織り込む方法はありますか? スタンドアロンの Tomcat 8 サーバーに WAR としてデプロイするとき、および/または「ファット」jar として起動するときに組み込みの Tomcat 8 サーバーを使用するときに、これを達成できるかどうかを知りたいと思います。

スタンドアローンのTomcat 8サーバーにデプロイしてもエラーは発生しませんが、getMyService()上記のメソッドはnullを返します。ファット jar として起動すると、起動時に次のエラーがスローされます。

Caused by: java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

本当の問題はSpecify a custom LoadTimeWeaver、Tomcat 8 でどうすればよいかということだと思います。ドキュメントに記載されているように、何も自動的に起こっているようには見えませんが、それが正確に何を意味するのかを誤解している可能性があります。

4

2 に答える 2

1

あなたはこれを試すことができます:

@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver() {
    return new InstrumentationLoadTimeWeaver();
}

また

明示的な Java エージェントを使用して JVM を起動する必要なく、アスペクトのサポートを有効にするために、Spring InstrumentationLoadTimeWeaver を動的にセットアップすることを解決する新しいライブラリがあります。

<dependency>
    <groupId>de.invesdwin</groupId>
    <artifactId>invesdwin-instrument</artifactId>
    <version>1.0.2</version>
</dependency>

@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication{
    public static void main(final String[] args) {
        DynamicInstrumentationLoader.waitForInitialized(); //dynamically attach java agent to jvm if not already present
        DynamicInstrumentationLoader.initLoadTimeWeavingContext(); //weave all classes before they are loaded as beans
        SpringApplication.run(TestApplication.class, args); //start application, load some classes
    }
}
于 2020-06-16T21:53:58.990 に答える