Bug回顧録:Gradle/springマルチプロジェクト分割
2939 ワード
前言
最近、以前のpythonテクノロジースタックのプロジェクトをjavaテクノロジースタックに完全に移行し、移行後のプロジェクトはますます膨大になり、プロジェクトの分割に着手しました.
分割ステップ
共用する特定の業務に関係のない部分をcommonに分解し,他の2つの業務の1つはメイン業務officep,1つは付加業務findd,officep,finddはいずれもcommonに依存し,finddは同時にofficepに依存する.分割後のディレクトリ構造は次のように見えます. common |-- build.gradle |-- src/main/java/com/uranome/fbs/common/ officep |-- build.gralde |-- src/main/java/com/uranome/fbs/officep/|-- src/main/java/com/uranome/fbs/officep/persistance/UserRepository.java findd |-- build.gradle |-- src/main/java/|-- src/main/java/com/uranome/fbs/findd/service/EvaluationService.java build.gradle settings.gradle
バグの到来
build.gradleとsettings.gradleファイルの作成は、公式doc
バグの試行
1.ComponentScanの修正
2.Entity Scanの追加
Googleの後に注釈を追加します.
今回投げ出した異常は以前とは違うが、まだ起きられない.
考える
私たちの既存の知識から、このバグの発生原因はbeanの自動組立失敗であるべきだと推測することができますが、現在から見れば、組立失敗は2つの原因にほかならない. beanのクラスはスキャンされませんでした. beanが存在するクラスはスキャンされたが、何らかの理由でbeanが作成されなかった.
2日間にわたるGoogleの後もバグは解決されず、springのDI全体の流れを深く理解する必要があることに気づきました.
その後はclone SpringBootの倉庫であり,
バグが発生した原因を知り、グーグルで検索してようやく解決策を得た.
バグの解決
最終的に得られたコードは、次のようになります.
src/main/java/com/uranome/fbs/findd/App.java
最近、以前のpythonテクノロジースタックのプロジェクトをjavaテクノロジースタックに完全に移行し、移行後のプロジェクトはますます膨大になり、プロジェクトの分割に着手しました.
分割ステップ
共用する特定の業務に関係のない部分をcommonに分解し,他の2つの業務の1つはメイン業務officep,1つは付加業務findd,officep,finddはいずれもcommonに依存し,finddは同時にofficepに依存する.分割後のディレクトリ構造は次のように見えます.
バグの到来
build.gradleとsettings.gradleファイルの作成は、公式doc
Authoring Multi-Project Builds
を直接参照します.コンパイルは順調に完了し、officepプロジェクトも順調に起動できますが、finddプロジェクトの起動時にエラーが発生しました.EvaluationServiceのUserRepositoryのアセンブリに失敗しました.UserRepositoryというBeanが見つかりません.バグは常に暴風雨のように激しく、UserRepositoryが@Repository
という注釈を加えたことを繰り返し確認した後もバグは存在した.バグの試行
1.ComponentScanの修正
com.uranome.fbs.officep.persistance
をfinddのComponentScanに追加し、テストの問題は依然として存在します.2.Entity Scanの追加
Googleの後に注釈を追加します.
@EntityScan({
"com.uranome.fbs.findd",
"com.uranome.fbs.officep.persistance",
})
今回投げ出した異常は以前とは違うが、まだ起きられない.
考える
私たちの既存の知識から、このバグの発生原因はbeanの自動組立失敗であるべきだと推測することができますが、現在から見れば、組立失敗は2つの原因にほかならない.
2日間にわたるGoogleの後もバグは解決されず、springのDI全体の流れを深く理解する必要があることに気づきました.
その後はclone SpringBootの倉庫であり,
run
に従ってコード+デバッグを行い,org.springframework.context.annotation.ConfigurationClassParser
のdoProcessConfigurationClass
メソッドでcom.uranome.fbs.officep.persistance
というパッケージを見たが,原因1は排除できることが分かった.次に理由2を検証すれば、すべてのsingleton beansはApplicationContext
が保有しているDefaultListableBeanFactory.preInstantiateSingletons
で作成されます(この段落で私が何を言っているのか分からない場合は、Springソースコードで解読した文章を参考にしたり、ソースコードを自分で見たりすることができます).UserRepositoryというbeanが作成されていない理由は、isAbstract
の判断から除外されているため、UserRepositoryはabstract
であることを意味する.RepositoryはSpring JPAでinterface
声明だったのを思い出してみると、abstract
ではないのがおかしいですね.バグが発生した原因を知り、グーグルで検索してようやく解決策を得た.
Repository
は、beanとして作成されるために特別な処理が必要であり、すなわち@EnableJpaRepositories
注釈を追加する.バグの解決
最終的に得られたコードは、次のようになります.
src/main/java/com/uranome/fbs/findd/App.java
@SpringBootApplication
@ComponentScan({"com.uranome.fbs.common", "com.uranome.fbs.findd",
"com.uranome.fbs.officep.persistance", "com.uranome.fbs.officep.service"})
@EnableJpaRepositories({"com.uranome.fbs.findd", "com.uranome.fbs.officep.persistance"})
@EntityScan({"com.uranome.fbs.findd", "com.uranome.fbs.officep.persistance"})
public class App