Spring boot/Batchアプリケーションを開発しています。
私がやりたいのは、仕事ごとに別々のモジュールを用意することです。異なるタスク(Spring Batch Job)には異なるドメインがあるため、これは合理的な決定です。
私が最初に考えたのは、Mavenをすべてのジョブのモジュールにすることです。次に、Mavenの依存関係をメインプロジェクトに追加して実行するだけです。
このソリューションの問題は、一部のプロジェクトがコンパイルされないか、ユニットテストに失敗した場合、アプリケーション全体もスタックすることです。
理想的には、他のモジュールが独自のCI/CDプロセスを続行できるのに対して、失敗したモジュールはアプリケーションにロードされないようにしたいと思います。
どうすればそれを達成できますか? Java 9このモジューラリティはこの使用例に使用できますか?
ありがとう
モジュールのライフサイクルが異なる場合、つまり、モジュールが常に同時にリリースされるわけではない場合、またはバグ修正や機能リリースが個別にある場合は、それぞれについて個別のリポジトリを検討する必要があります。基本的に、CI/CDパイプラインがそれぞれに個別にあります。これは、個々のモジュールが互いをブロックすることを回避できる唯一の健全な方法です。
つまり、モジュールに必要なインターフェースを定義する「api」モジュールが1つあることになります(それが何であっても)。このAPIは最小限に抑え、比較的安定した状態に保つ必要があります。これはすべてのモジュールが依存する必要があるだからです。
次に、実際のapplicationが作成されますすべてのモジュールによって異なります。 「プラグイン」の要件が静的である場合、つまり、オンザフライでのリロードや、同じモジュールの複数のバージョンを同時に必要としない場合は、単純なServiceLoader
を使用してください。アプリケーションに、それを介して各モジュールを単にインスタンス化/開始させる。このためのCI/CDパイプラインは、モジュールの新しいバージョン/リリースが利用可能になったときにトリガーされる必要があります。
動的ロード要件がある場合は、OSGiのようなものを使用する必要があります。ただし、すべてが動的であるため、サービスやクラスなどのものがいつでも消える可能性があり、かなり煩わしく安全にコーディングするのが難しいため、非常に複雑になる可能性があります。構造は依然として本質的に同じままです。
注:すべてが1つのチームの手に委ねられている場合は、1つのリポジトリーを用意しようと思います。すべてが同じ場所にあるため、(コンパイル)問題があれば修正するのが簡単になり、個別のリポジトリCI/CDパイプラインやバージョン管理の問題に対処する必要がなくなります。