1.説明
SpringBootのMavenプラグインは、Mavenの方法でアプリケーションにSpringBootサポートを提供できます。つまり、SpringBootアプリケーションはMaven操作を実行できます。
SpringBootのMavenプラグインは、SpringBootアプリケーションを実行可能なjarまたはwarパッケージとしてパッケージ化し、java -jarなどの通常の方法でSpringBootアプリケーションを実行できます。
2.対応するプラグイン
Spring Boot Mavenプラグインの5つの目標:
- 再パッケージ、デフォルトの目標。mvnパッケージの後に、実行可能なjar / warを再度パッケージ化し、mvnパッケージによって生成されたjar / warを.originとして保持します。
- 実行、SpringBootアプリケーションを実行
- 開始、mvn統合テスト段階で、SpringBootアプリケーションのライフサイクルを管理する
- 停止、mvn統合テストフェーズで、SpringBootアプリケーションのライフサイクルを管理
- build-info、Actuatorが使用するビルド情報ファイルbuild-info.propertiesを生成します
3.関連する構成
対応するpom.xmlファイルの構成は次のとおりです。
<plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <configuration> <mainClass> com.xxx.bs.SearchBsBootstrap </ mainClass> </ configuration> <executions> <execution> <goals> <goal> repackage </ goal> </ goals> </ execution> </ executions> </ plugin>
4.説明を再パッケージ化する
Spring Boot Mavenプラグインの主な目的は再パッケージ化です。これは、Mavenパッケージライフサイクルステージで、mvnパッケージによって生成されたパッケージを実行可能パッケージとして再度パッケージ化し、mvnパッケージによって生成されたパッケージの名前を*に変更できます。 。オリジナル
上記の構成に基づいて、Jarソフトウェアパッケージを生成するプロジェクトで次のコマンドを実行します。
mvnパッケージspring-boot:repackage
生成された2つのjarファイルを確認できます。1つは* .jar、もう1つは* .jar.originalです。
上記のコマンドを実行する過程で、Mavenは最初に* .jarファイルをパッケージ化してパッケージステージで生成し、次にspring-boot:repackage to repackageを実行して、次のようにマニフェストファイルで構成されたMain-Class属性を探します。
マニフェストバージョン:1.0 実装-タイトル:search-bs 実装 -バージョン:0.1。0 アーカイバ - バージョン:神経叢アーカイバ 内蔵 - によって:SAMの 実装 -Vendor- イド:org.springframework 春 -boot-バージョン:2.1.2 .RELEASE 実装 - ベンダー:ピボタルソフトウェア株式会社 メイン - クラス:org.springframework.boot .loader.JarLauncher Start - Class:com.xxx.bs.SearchBsBootstrap Spring -Boot-Classes:BOOT-INF / classes / Spring-Boot-Lib:BOOT-INF / lib / 作成 -By:Apache Maven 3.6。0 ビルド -Jdk:1.8 .0_155
Main-Class属性値はorg.springframework.boot.loader.JarLauncherであることに注意してください。
Start-Class属性値はcom.xxx.bs.SearchBsBootstrapです。
com.xxx.bs.SearchBsBootstrapクラスは、プログラムのエントリポイントであるmain()メソッドを定義します。
通常、SpringBoot Mavenプラグインは、パッケージ化プロセス中にマニフェストファイルのMain-Class属性を自動的に設定します。実際、この属性のジオメトリは、SpringBoot Mavenプラグインの構成属性レイアウトによっても制御できます。例は次のとおりです。
<plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <version> 2.1。2 .RELEASE </ version> <configuration> <mainClass> $ {start-class} </ mainClass> <layout> ZIP </ layout> </ configuration> <executions> <execution> <goals> <goal> repackage </ゴール> </ goals> </ execution> </ executions> </ plugin>
ここでのレイアウト属性値はZIPであることに注意してください。
レイアウト属性の値は次のとおりです。
- JAR、通常の実行可能なjar
メインクラス:org.springframework.boot.loader.JarLauncher
- WAR、通常の実行可能なwar、必要なサーブレットコンテナーはWEB-INF / lib-providedに依存
メインクラス:org.springframework.boot.loader.warLauncher
- ZIPまたはDIRはJARに似ています
メインクラス:org.springframework.boot.loader.PropertiesLauncher
モジュール、すべての依存ライブラリ(スコープが提供されているライブラリを除く)をパッケージ化しますが、Spring BootのLauncherはパッケージ化しません。
NONE、すべての依存ライブラリをパッケージ化しますが、Launcher of Spring Bootはパッケージ化しません。
5.質問の回答
Springbootがjarパッケージにヒットし、jarパッケージ内のクラスを参照できません。
問題の説明:
私のディレクトリ構造は親プロジェクトです。クライアント、共通、サーバーの3つのサブプロジェクトがあります。クライアントは、提供されるすべての外部インターフェースです。このプロジェクトをパッケージ化すると、クライアントのパッケージが外部に提供されます。問題は、このパッケージに依存する他のプロジェクトが内部の通常のクラスを参照できないことです。そして、パッケージ化する前に、まずコンパイルしてインストールする必要があります。そうしないと、クライアントはクラスを共通に参照できないと報告します。
質問の答え:
上記のスプリングブートパッケージ方法のため、ここでのjarは通常の意味でのjarパッケージまたはJavaのパブリッククラスライブラリではなく、独立したWebアプリケーションであることを理解する必要があります。実際、ここの瓶は戦争であるべきです。SpringBootの設計思想のために、アプリケーションはjarを使用します。jarがサービスとしてアクセスされない場合、エントリークラスがまったくなく、実行可能なjarも必要ないため、SpringBootプラグインでjarを再パッケージ化する必要はありません。したがって、この状況では、状況によって異なります。
1.パッケージが実行可能なjarパッケージの場合、内部のパブリックライブラリをパブリックライブラリであるjarパッケージにカプセル化する必要があります。この実行可能なjarパッケージまたはwarパッケージは、外部サービスを提供します。 、参照に直接依存することはできません。
2.それが単なる一般的なパブリッククラスライブラリのjarパッケージである場合、pomファイルを変更する必要があるのは、Springbootの再パッケージパッケージ化メソッドを使用して、通常のパッケージングメソッドをmavenに変更することだけです。
<plugin> <groupId> org.apache.maven.plugins </ groupId> <artifactId> maven-compiler-plugin </ artifactId> <configuration> <source> 8 </ source> <target> 8 </ target> </設定> </ plugin>