ドメイン オブジェクトをセットアップしようとして@Configurable
います (Spring コンテナーによって管理されていません)。
を JVM 引数として追加することでこれを機能させましたが-javaagent:path/to/spring-instrument.jar
、この -javaagent を配置する必要があるかどうかは 100% 明確ではありません。これをTomcat 8で実行しています。ドキュメントを誤解している可能性がありますが、これを達成するために別のメカニズム、特に次の行を使用できるようです。
TomcatInstrumentableClassLoader
on 以上は定義しないでください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 でどうすればよいかということだと思います。ドキュメントに記載されているように、何も自動的に起こっているようには見えませんが、それが正確に何を意味するのかを誤解している可能性があります。