SpringBoot項目可以直接打成jar包,發布到服務器上,通過java -jar命令執行,發布運行一個服務端的項目非常方便。
那SpringBoot的jar包是如何運行起來的呢?先手動做一個可執行的jar包吧
目錄結構
image.png
程序代碼
package com.compile.demo.bean;
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
package com.compile.demo;
import com.compile.demo.bean.Student;
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
String str = "Hello ";
Student s = new Student("zhangsan");
if (StringUtils.isNotEmpty(str)) {
System.out.println(str + s.getName());
} else {
System.out.println("為空!");
}
}
}
手動編譯
- 執行:
javac -encoding utf-8 -Djava.ext.dirs=libs -d classes src\com\compile\demo\*.java src\com\compile\demo\bean\*.java
- 當前目錄結構:
image.png
手動編譯的詳細過程請參照:手動編譯及執行java類(包含并引用第三方jar)
打jar包
- 創建MANIFEST.MF文件
Manifest-Version: 1.0
Main-Class: com.compile.demo.Main
Class-Path: commons-lang3-3.4.jar
請務必在文件的最后一行,至少加一個回車換行
- Manifest-Version 版本號默認為1.0
- Main-Class 入口的主類,也就是main方法所在的類
- Class-Path 引用外部類的路徑
-
再將手動編譯的.class文件和引用的commons-lang3-3.4.jar移動到與MANIFEST.MF同一個目錄下
image.png - 打包
在該文件夾下執行:jar -cvfm compile.jar MANIFEST.MF com commons-lang3-3.4.jar
- jar命令是jdk自帶的,可在%JAVA_HOME%\bin中找到
- c 創建新檔案
- v 在標準輸出中生成詳細輸出,有輸出信息
- f 指定檔案文件名
- m 包含指定清單文件中的清單信息,也就是指定我們的MANIFEST.MF 如果沒有這個參數,會生成一個默認的MANIFEST.MF文件
- compile.jar 指定生成jar包的名稱
-
MANIFEST.MF com commons-lang3-3.4.jar 要打包的文件
成功之后會在當前文件夾下生成一個compile.jar
image.png
- 運行
執行:java -jar compile.jar
輸出結果:Hello zhangsan
jar包結構
可借助IntelliJ IDEA來查看,圖形化的結構看起來更清晰
image.png
根目錄下是
- com 就是我們的.class文件
- commons-lang3-3.4.jar 依賴的外部jar包
-
META-INF 放著MANIFEST.MF,這個文件不可少,文件的內容也不能隨意改動
image.png
可以看出,文件內容與我們打包之前的基本沒有變化,只是多了一個Created-By
執行java -jar命令時,就是根據Main-Class找到程序的入口,通過Class-Path找到依賴的外部jar包