【SpringBootシリーズ】SpringBootのパッケージ化と運用

輸入前

開発と学習を始めたばかりの小さな友達は、知識について間違った理解をしている可能性があります. 私たちは毎日 Idea の下でプログラムを書き、それらも Idea の下で実行されます.

ここに画像の説明を挿入

しかし、実際の開発が完了すると、プロジェクトを自分のコンピューターで実行することはできなくなります。

ここに画像の説明を挿入

将来私たちが作るプログラムは専用サーバー上で動作します. 簡単に言えば, 自分が作ったプログラムを独立して動作するコンピュータに置くことになります. このコンピュータはあなたが開発して使用したコンピュータよりも専門的であり, さまざまなセキュリティを備えています.レベル. 現在のコンピューターよりもはるかに多くの.

ここに画像の説明を挿入

この専用コンピューターにプログラムを配置する方法。これには、プログラムをファイルに整理してから、このファイルをこのサーバーに転送する必要があります。ここには 2 つのプロセスがあり、1 つはパッケージング プロセスで、もう 1 つは実行プロセスです。

環境の適応性を確保するために、エンタープライズ プロジェクトは次のプロセスを使用してプロジェクトをリリースします。
① 開発部門は Git、SVN およびその他のバージョン管理ツールを使用して、プロジェクトをバージョン サーバーにアップロードします
。制御ツールをダウンロードしてプロジェクトをダウンロード
③サーバーは現在の実機でMavenツールを使用 環境にプロジェクトを再構築
④サービスを開始

結論は:

  • パッケージングとは、プログラムを実行可能ファイルに変換することを指します
  • 不依赖开发环境実行とは、パッケージ化によって生成されたファイルを実行することを指します

上記の 2 つの操作には、すばやく実行できる対応するコマンドがあります。

プログラムのパッケージ化

SpringBoot プログラムは Maven に基づいて作成され、Maven は package と呼ばれるパッケージ化された命令を提供します。この操作は Idea 環境で実行できます。

//在终端项目路径输入
mvn package

パッケージ化後、プロジェクト名と同様の jar ファイルが生成され、その名前はモジュール名 + バージョン番号 + .jar で構成されます。
ここに画像の説明を挿入

jar パッケージは、プロジェクトが配置されているターゲット フォルダーにあります。

もちろん、次のことも直接できます。
ここに画像の説明を挿入

または、IDE の右側にある Maven で、パッケージをクリックすることもできます。
ここに画像の説明を挿入

知らせ:
パッケージのライフサイクルの前にもテストがあることがわかります.Mavenの特性上、パッケージコマンドを実行すると、前のライフサイクルが実行されます. つまり、テストでデータ ソースに影響するものをビルドする場合は、パッケージ化する前にテストも実行します。その後、プロジェクトを再度パッケージ化すると、実行時にデータが変更されていることがわかります。
現時点では、テスト サイクルをスキップする必要があります (テストがデータ層に影響を与えない場合は、スキップできます)。多くの方法がありますが、ここでは 1 つだけ:
ここに画像の説明を挿入
青い稲妻アイコンをクリックして、テスト項目を見つけます。グレー表示されている場合は、有効になっていることを意味します。
ここに画像の説明を挿入

プログラム実行中

パッケージの準備ができたら、直接実行できます。パッケージが配置されているパスで、コマンドを実行します。

java -jar 工程包名.jar

ここに画像の説明を挿入

プログラムのパッケージ化命令を実行した後、プログラムは正常に実行されます。これは、アイデアの下でプログラムを実行するのと同じです。

特記事項: Java jdk 環境がインストールされていない場合、プログラムの実行は Java 命令を使用するため、上記の操作は正しく実行できません。

特記事項 : ウィザードを使用して SpringBoot プロジェクトを作成する場合、pom.xml ファイルに次の構成が存在します.この構成は削除しないでください.削除しないと、パッケージング後にプログラムが正常に実行できなくなります.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

要約する

  1. SpringBoot プロジェクトは、Java 環境での jar ファイルの独立した実行に基づいてサービスを開始できます。
  2. SpringBoot プロジェクトは、パッケージ化のために mvn コマンド パッケージを実行します。
  3. jar コマンドを実行します: java –jar プロジェクト名.jar

SpringBoot プログラムのパッケージ化の失敗処理

一部の小さなパートナーをパッケージ化して実行した後、次のような現象が発生し、プログラムが正常に実行されなくなります。

ここに画像の説明を挿入

この問題を理解したい場合は、.jar ファイルの動作メカニズムについて説明する必要があります.このことを知っていれば、そのような問題を回避する方法がわかります.

Java 開発では、通常、mysql ドライバー jar パッケージなど、多くの jar パッケージと接触します。上記のプログラムをパッケージ化した後に得られるものも jar ファイルです。このとき、上記の java -jar コマンドを使用して mysql ドライバーの jar パッケージを実行すると、上記の実行不能現象が発生し、なぜ弊社の SpringBoot プロジェクトを実行できるのでしょうか? 実際、それはさまざまなパッケージ方法によるものです。

SpringBoot プロジェクトの pom.xml には、次の一連の構成があり、この一連の構成によって、パッケージ化されたパッケージを実行できるかどうかが決まります。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

この構成を開き、この構成をコメント アウトして 2 つのパッケージをそれぞれ実行し、パッケージ化された 2 つのパッケージの違いを観察します。明らかな 3 つの機能があります。

  • パッキング後のファイルサイズが異なる
  • パッケージの中身が違う
  • パッケージャー内の個々のファイルの内容は異なります

1つ目の現象を見てみると、ファイルサイズが違います。構成付きパッケージングによって生成されるパッケージ サイズは次のとおりです。
ここに画像の説明を挿入

構成ありのパッケージの体積が構成なしのパッケージの 30 倍であることは容易にわかりますが、その中に何が入っているのでしょうか? そんなにありえるの?内部の違いを見てみましょう。

ここに画像の説明を挿入ここに画像の説明を挿入

内容が完全に異なることがわかりました。META-INF と呼ばれるディレクトリが 1 つだけ同じです。大容量パッケージのBOOT-INFディレクトリ下のclassesディレクトリを開くと、小容量パッケージと全く同じ内容であることがわかります。


小さなパッケージの内容に加えて、大きなパッケージには他のものがあることがわかりました. 何があるの?BOOT-INF ディレクトリに戻り、lib ディレクトリを開くと、多数の jar ファイルが表示されます。

ここに画像の説明を挿入

これらの jar ファイルが、このプロジェクトを作成したときにインポートした座標に対応するファイルであることがわかります。パッケージ化および生成されたプログラムを独立して実行するために、SpringBoot プログラムは、プロジェクトで独自に開発したコンテンツをパッケージ化するだけでなく、現在のプロジェクトで使用する必要があるすべての jar パッケージもパッケージ化しました。なぜそれをするのですか?自立して走れるようになるだけ。現在のプログラムは、パッケージ外のリソースから独立して実行できます。これは、大きなパッケージが小さなパッケージよりも 30 倍大きい主な理由でもあります。

大きいパッケージの違いを見てみましょう. 一番外側のディレクトリには org ディレクトリが含まれています. このディレクトリに入ります. ディレクトリ名は org\springframework\boot\loader で, その中にJarLauncher.classファイルがあります. 覚えておいてください.最初にこのファイル。この一連のディレクトリ名を見ると、明らかに Spring のディレクトリ名ですが、Spring フレームワークをこのパッケージにパックする理由は何ですか? わからない。

2つのパッケージの一番外側のディレクトリに戻り、META-INFフォルダの下にMANIFEST.MFという同じ名前でサイズが違うファイルがあることを確認し、ファイルを開いて内容を比較します。

  • 小さなファイル用の MANIFEST.MF

    Manifest-Version: 1.0
    Implementation-Title: springboot_08_ssmp
    Implementation-Version: 0.0.1-SNAPSHOT
    Build-Jdk-Spec: 1.8
    Created-By: Maven Jar Plugin 3.2.0
    
  • バルク ファイル用の MANIFEST.MF

    Manifest-Version: 1.0
    Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
    Implementation-Title: springboot_08_ssmp
    Implementation-Version: 0.0.1-SNAPSHOT
    Spring-Boot-Layers-Index: BOOT-INF/layers.idx
    Start-Class: com.itheima.SSMPApplication
    Spring-Boot-Classes: BOOT-INF/classes/
    Spring-Boot-Lib: BOOT-INF/lib/
    Build-Jdk-Spec: 1.8
    Spring-Boot-Version: 2.5.4
    Created-By: Maven Jar Plugin 3.2.0
    Main-Class: org.springframework.boot.loader.JarLauncher
    

大きなファイルには明らかに小さなファイルよりも数行の情報があり、情報の最後の行は Main-Class: org.springframework.boot.loader. JarLauncherです。この文はどういう意味ですか? このパッケージを java -jar で実行すると、Main-Class プロパティによって構成されたクラスが実行されます。これはたまたま先ほど見たファイルです。SpringBoot パッケージャーの Spring フレームワークに表示されるのは、このサービス用であることが判明しました。そして、この org.springframework.boot.loader.JarLauncherクラスは、Start-Class プロパティで構成されたクラスを見つけて、対応するクラスを実行する必要があります。このプロパティは現在の構成にも存在し、ブートストラップ クラス名に対応します。

これで、この一連の設定の役割が明確になりました

  1. SpringBoot プログラムに構成を追加すると、Spring フレームワークの一部の機能、元のプロジェクト コンテンツ、および元のプロジェクトが依存する jar パッケージを含む特別なパッケージが出力されます。
  2. 最初に MANIFEST.MF ファイルの Main-Class プロパティを読み取り、 java -jar コマンドの実行後に実行されるクラスをマークします。
  3. JarLauncher クラスが実行されると、スタートアップ クラスの名前である Start-Class プロパティが検出されます。
  4. スタートアップ クラスを実行すると、現在のプロジェクトのコンテンツが実行されます。
  5. 現在のプロジェクトを実行すると、依存する jar パッケージが使用され、lib ディレクトリから検索されます。

SpringBoot は、パッケージを独立して実行するために多大な努力を払い、使用する必要のあるすべてのリソースをこのパッケージに追加したようです。そのため、この jar パッケージは独立して実行できます。

前のエラー メッセージをもう一度見てください。

ここに画像の説明を挿入

パッケージ化時にその構成が使用されなかったため、パッケージ化後に通常の jar パッケージが形成され、MANIFEST.MF ファイルに Main-Class に対応する属性がないため、メイン リスト属性が見つからないというランタイム プロンプトが表示されます。エラーの理由です。

要約する

  1. spring-boot-maven-plugin プラグインは、現在のプログラムを独立して実行できるパッケージにパッケージ化するために使用されます

コマンド ライン起動に関する FAQ と解決策

DOS 環境で SpringBoot プロジェクトを開始すると、ポート占有の問題が発生する場合があります。次のコマンドが役立つ場合があります。

# 查询端口
netstat -ano
# 查询指定端口
netstat -ano |findstr "端口号"
# 根据进程PID查询进程名称
tasklist |findstr "进程PID号"
# 根据PID杀死任务
taskkill /F /PID "进程PID号"
# 根据进程名称杀死任务
taskkill -f -t -im "进程名称"

Supongo que te gusta

Origin blog.csdn.net/zyb18507175502/article/details/126263472
Recomendado
Clasificación