問題タブ [load-time-weaving]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring - AspectJ を使用した Spring AOP: 読み込み時間の織り方
AspectJ ベースの Spring AOP を使用している場合、ロード時間ウィービングを使用するようにアスペクトを構成する必要がありますか? または、AspectJ ベースのアプローチを使用する場合、Spring AOP は実行時/コンパイル時のウィービングもサポートしますか?
spring - Spring @Configurable クラスで依存関係が自動配線されない問題
Spring Boot アプリの Load Time Weaving を構成して、@Configurable
Java クラスへの依存関係を適切に自動配線しようとしています。
これが私の構成/メインクラスです:
アプリケーションを起動する方法は次のとおりです (私の gradle ビルドは spring-instrument jar の名前を変更しました)。
@Configurable
依存関係が自動配線されないクラスは次のとおりです。
クラスがインスタンス化される場所は次のとおりです( を使用new
):
StringToDayToTimeSlotConverter
の依存関係が自動配線されない理由を理解するのを手伝ってもらえますか?
spring - TomcatLoadTimeWeaver が Log4j 2 を壊す
and に深刻な問題がTomcatLoadTimerWeaver
ありLog4j
、解決方法がわかりません。
私は以下を使用しています:
- トムキャット 8
- 春のフレームワーク 4.1.2
- Log4j 2.1
- SLF4J 1.7.7
- トップリンク 2.5.2
すべてのロギングは SLF4J にルーティングされ、Log4j 2.1 をロギング バックエンドとして使用しています。web.xml
Log4j は、log4jConfiguration
context-paramで指定された非標準の場所から構成ファイルを取得するように構成されています。はLog4jServletContainerInitializer
、webapp の開始時に Log4j を適切に構成します。Spring がTomcatLoadTimeWeaver
.
私はEclipseLinkでロードタイムウィービングを使用したいので、これをアプリケーションコンテキストに追加しました:
問題は次のとおりです。Spring がTomcatLoadTimeWeaver
Tomcat の にトランスフォーマーを追加して を登録すると、その後 SLF4J を介して何かをログに記録しようとすると、Log4j が暗黙的に再初期化されます。構成ファイルが標準の場所 (= のルート) にないためです。WebappClassLoader
クラスパス) エラーが表示されます:
log4j2 構成ファイルが見つかりません
その瞬間から、すべてのログ呼び出しが適切に (= MY で指定した方法でlog4j.xml
) 処理されなくなり、Commons Logging と JUL 用の SLF4J+Log4j+bridges の慎重な構成が完全に壊れてしまいます。
クラス ローダー トランスフォーマーを追加すると、Log4j で何かがリセットされているようです。そのため、それ自体を再構成する必要があります。この問題をよりよく理解するために数時間を費やしましたが、Log4j の深い知識がなければ簡単ではありません。内部。
mylog4j.xml
をlog4j2.xml
クラスパス ルートに移動することは (展開上の理由から) 簡単にできることではありません。
おそらく、ロード時間ウィーバーの初期設定 (Log4j が初めて設定される前) でうまくいくかもしれませんが、通常、Log4j は Spring 自体の前に設定する必要があるため、その方法はわかりません。
どんな提案でも大歓迎です。
詳細
DefaultContextLoadTimeWeaver
実際には、Spring の( を運ぶTomcatLoadTimeWeaver
) が初期化されるときは問題は発生しませんが、EclipseLink でLocalContainerEntityManagerFactoryBean
を設定するために使用されるEntityManagerFactory
が初期化されるとき (つまり、が呼び出されるときorg.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet()
) に発生します。 EclipseLinkによるorg.springframework.context.weaving.DefaultContextLoadTimeWeaver.addTransformer(ClassFileTransformer)
ネイティブの実際の作成(によってトリガーされます)。そのため、私の回避策は、の初期化をインターセプトするを登録し、強制的に再度実行して、webapp 設定で Log4j を再構成することでした。しかし、これらの Log4j クラスはデフォルトのメソッドと保護されたメソッドでいっぱいであり、これを機能させるにはリフレクションを使用して Bean ポスト プロセッサをパッケージに配置する必要があったため、私は恐ろしいハックに終わりました。EntityManagerFactory
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory()
BeanPostProcessor
LocalContainerEntityManagerFactoryBean
org.apache.logging.log4j.web.Log4jWebInitializerImpl.start()
org.apache.logging.log4j.core
よりスマートなソリューション/提案/代替アプローチを歓迎します。
本当の原因
システム全体をさらにデバッグし、この問題の原因を突き止めました。このためにLOG4J2-903を開きました。つまり、Log4j はクラス ローダーのtoString()
値を使用して、マップ内の現在のログ コンテキストを検索します。トランスフォーマーを登録するとTomcatのWebappClassLoader.toString()
メソッドが変更されるため、Log4jは以前に構成されたコンテキストを取得できず、EclipseLink + Springがロードタイムウィーバートランスフォーマーを登録するとすぐに新しいコンテキストを作成します... :-(
java - vm引数のjavaagentでwildfly 8.2の起動が失敗する
私はwildfly8が初めてで、aspectJも初めてです。LTW (ロード時間ウィービング) の目的で、aspectjWeaver.jar の VM 引数に javaagent 引数を追加すると、Wildfly 8.2 の起動が失敗します。
ログマネージャーエラーを下回っています:
ここで、上記の例外よりもブートスタープパスに jboss-logmanager-1.3.1.Final.jar を追加する場合と一緒に以下の 2 つの vm 引数を追加すると、ログフォーマッターの以下の例外が表示され、再びワイルドフライは表示されません始めました。2 つの VM 引数:
エラー スタック トレース:
ロード時間の織り込みのために、javaagent VMでaspectjWeaver.jarを使用してwildfly8.2を実行するためにさらに何が必要かを誰でも提案できますか?
java - コンクリート アスペクトの親アスペクトが見つかりません
wildfly8.2 の単純な hello world の通常のサーブレット ベースの例で、読み込み時間の織り方をテストしようとしています。
以下のアスペクトコードがあります
以下の実行時フィールド注釈
テスト サーブレット:
サービス クラス:
web-inf の下の Aop.xml:
そしてPOM.xml:
以下のリンクを使用して、ロード時間の織り方を構成します。http://wiki.eclipse.org/LTWJboss7
上記の後、wildfly を起動すると、以下のエラー スタック トレースが表示されます。
ここで何が間違っていたのか混乱しています。誰かが私のテストプログラムを実行するのを手伝ってくれますか? 私はワイルドフライでAspectJとLTWを学んでおり、これは初めてです。ありがとう、
spring-boot - 組み込みの Tomcat で Spring Boot の読み込み時間のウィービングが機能しない
Spring Boot 1.2.2 w/ Embedded Tomcat で LTW を動作させることができません。
私のアプリケーションは .JAR ファイルではなく、WAR ファイルです。DEBUGで実行すると、ポイントカットに一致するはずの呼び出しを実行しても、私の側面では停止しないため、機能していないと思います...
私の実行スクリプトはこれを行います:
Spring Boot では、この AOP Config を ApplicationInitializer としてロードするため、すぐに親の ApplicationContext にあり、その後の埋め込み tomcat Web アプリケーション コンテキストの残りすべてに対してそこにあるはずです。
私のアスペクトは次のようになります。
私の組み込み WAR の META-INF/aop.xml は次のとおりです。