Windows中使用BAT文件運行Java?Main方法的完整指南
簡介:
在Windows系統(tǒng)中, bat 文件常用于自動化執(zhí)行命令行操作,尤其適用于運行Java應(yīng)用程序。本文介紹了如何通過創(chuàng)建 bat 文件來運行包含 main 方法的Java程序,詳細說明了創(chuàng)建步驟和關(guān)鍵命令的作用,幫助開發(fā)者高效完成Java程序的測試與部署
1. BAT文件簡介與作用
在Windows操作系統(tǒng)中,BAT文件是一種以 .bat 為擴展名的批處理腳本文件,能夠按順序執(zhí)行一系列命令行指令,從而實現(xiàn)任務(wù)自動化。它基于CMD命令解釋器運行,無需額外安裝解釋環(huán)境,適合快速構(gòu)建系統(tǒng)級自動化流程。
BAT文件廣泛應(yīng)用于程序啟動、環(huán)境配置、日志清理、批量文件操作等場景。例如,開發(fā)人員常用BAT腳本來編譯項目、運行Java程序、設(shè)置環(huán)境變量等。掌握BAT腳本編寫技能,有助于提升Windows平臺下的開發(fā)與運維效率。
2. Java Main方法定義格式
Java語言中, main 方法是程序的入口點,是Java虛擬機(JVM)執(zhí)行Java程序的起始位置。理解 main 方法的定義格式,對于掌握Java程序的運行機制至關(guān)重要。本章將深入剖析 main 方法的語法結(jié)構(gòu)、與類的關(guān)系以及在JVM啟動過程中的作用。
2.1 Main方法的基本語法
Java程序的啟動總是從一個類的 main 方法開始。該方法的定義格式是固定的,任何Java程序都必須遵循這一標準格式才能被JVM識別和執(zhí)行。
2.1.1 public static void main(String[] args)的組成
main 方法的標準定義如下:
public static void main(String[] args) {
// 程序執(zhí)行入口代碼
}
該方法簽名的每個部分都有其特定含義:
| 關(guān)鍵字/部分 | 含義說明 |
|---|---|
public | 方法必須是公開的,JVM需要從外部訪問該方法。 |
static | 方法必須是靜態(tài)的,這樣JVM可以在不創(chuàng)建類實例的情況下調(diào)用它。 |
void | main 方法沒有返回值。 |
main | 方法名,JVM通過該名稱識別程序入口。 |
String[] args | 命令行參數(shù),用于接收運行時傳入的參數(shù)。 |
逐行代碼解讀分析:
public: 公共訪問權(quán)限,確保JVM可以訪問該方法。static: 靜態(tài)方法,無需實例化類即可調(diào)用。void: 表示該方法不返回任何值。main: 方法名,JVM查找該名稱作為程序入口。(String[] args): 接收命令行參數(shù)的字符串數(shù)組。
2.1.2 參數(shù)傳遞與入口點的識別
String[] args 是 main 方法的一個關(guān)鍵參數(shù),它允許在運行Java程序時傳入?yún)?shù)。例如:
java MyApp arg1 arg2
此時, args 數(shù)組內(nèi)容為:
args[0] = "arg1"; args[1] = "arg2";
JVM在啟動時會自動解析命令行參數(shù)并將其轉(zhuǎn)換為字符串數(shù)組傳入 main 方法。
注意 :如果類中沒有定義
main方法,或方法簽名不正確,JVM將拋出NoSuchMethodError錯誤。
代碼示例:
public class CommandLineArgs {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("參數(shù) " + (i + 1) + ": " + args[i]);
}
}
}
執(zhí)行流程分析:
- 使用
javac CommandLineArgs.java編譯該類。 - 執(zhí)行命令
java CommandLineArgs hello world。 - 輸出結(jié)果:
參數(shù) 1: hello 參數(shù) 2: world
該示例展示了如何接收并處理命令行參數(shù)。
2.2 Java類與Main方法的關(guān)系
在Java中,每個可執(zhí)行程序都必須屬于某個類。理解類與 main 方法之間的關(guān)系,有助于更好地組織和管理Java項目結(jié)構(gòu)。
2.2.1 類文件編譯后的結(jié)構(gòu)
Java源文件( .java )經(jīng)過編譯后會生成對應(yīng)的字節(jié)碼文件( .class )。例如:
javac HelloWorld.java
會生成 HelloWorld.class 文件。該文件包含類的元數(shù)據(jù)、方法表、字段信息以及字節(jié)碼指令等。
使用 javap 工具反編譯類文件:
javap -c HelloWorld.class
輸出內(nèi)容中將包含 main 方法的字節(jié)碼邏輯,如下所示:
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello, World!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
這說明 main 方法是類文件中被JVM優(yōu)先識別和調(diào)用的方法。
2.2.2 多Main類程序的主類選擇
一個Java項目中可能包含多個具有 main 方法的類。此時,必須在運行時指定主類,告訴JVM從哪個類開始執(zhí)行。
例如:
java com.example.MainClass
其中, com.example.MainClass 是包含正確 main 方法的完整類名。
實際操作示例:
假設(shè)有兩個類:
// MainA.java
public class MainA {
public static void main(String[] args) {
System.out.println("This is MainA");
}
}
// MainB.java
public class MainB {
public static void main(String[] args) {
System.out.println("This is MainB");
}
}
編譯后運行:
javac MainA.java MainB.java java MainA
輸出:
This is MainA
如需運行 MainB ,則應(yīng)執(zhí)行:
java MainB
2.3 Main方法在JVM啟動中的作用
main 方法是JVM啟動程序的起點。深入理解JVM如何加載主類、設(shè)置類路徑,有助于排查運行時問題。
2.3.1 JVM如何加載主類
JVM在啟動時會通過類加載器(ClassLoader)加載用戶指定的主類。其流程如下:
graph TD
A[用戶執(zhí)行 java com.example.Main] --> B{JVM啟動}
B --> C[創(chuàng)建Bootstrap ClassLoader]
C --> D[加載rt.jar等核心類]
D --> E[創(chuàng)建Extension ClassLoader]
E --> F[加載擴展類庫]
F --> G[創(chuàng)建Application ClassLoader]
G --> H[加載用戶類路徑中的類]
H --> I{加載Main類}
I --> J[驗證main方法是否存在]
J --> K{main方法簽名是否正確}
K -- 正確 --> L[調(diào)用main方法]
K -- 錯誤 --> M[拋出NoSuchMethodError]
此流程展示了從啟動JVM到調(diào)用 main 方法的全過程。
2.3.2 啟動過程中的類路徑設(shè)置
Java程序運行時需要加載多個類文件,JVM通過類路徑(classpath)來定位這些類。
- 默認類路徑為當前目錄(
.) - 可通過
-cp或-classpath參數(shù)指定自定義路徑:
java -cp /myapp/classes com.example.Main
代碼示例:
假設(shè)類文件位于 /project/classes/com/example/Main.class ,則執(zhí)行命令如下:
java -cp /project/classes com.example.Main
JVM將從 /project/classes 目錄下查找 com.example.Main 類。
常見錯誤分析:
ClassNotFoundException:類路徑未正確設(shè)置,找不到主類。NoClassDefFoundError:運行時缺少依賴類。NoSuchMethodError:main方法簽名不正確或不存在。
本章通過由淺入深的方式,從 main 方法的基本語法入手,逐步深入到類與方法的關(guān)系、JVM加載機制,結(jié)合代碼示例與流程圖分析,全面解析了Java程序的入口執(zhí)行邏輯。下一章節(jié)將介紹JAR文件的打包與結(jié)構(gòu)說明,為后續(xù)BAT腳本調(diào)用Java程序做準備。
3. JAR文件打包與結(jié)構(gòu)說明
在Java開發(fā)中,JAR(Java Archive)文件是一種常見的歸檔格式,用于將多個類文件、資源文件和元數(shù)據(jù)打包成一個獨立的文件。JAR文件不僅便于分發(fā)和部署,還支持壓縮和清單文件( MANIFEST.MF )的配置,能夠指定主類、依賴信息等。本章將深入講解JAR文件的組成結(jié)構(gòu)、打包方法、清單文件的作用以及如何驗證JAR包的執(zhí)行能力。
3.1 JAR文件的基本概念
3.1.1 JAR包的作用與優(yōu)勢
JAR(Java Archive)文件本質(zhì)上是一個 ZIP 格式的壓縮包,專門用于打包 Java 應(yīng)用程序中的類文件( .class )、資源文件(如圖片、配置文件)以及元數(shù)據(jù)。它在Java開發(fā)和部署中扮演著重要角色。
作用:
- 封裝代碼與資源 :將多個類文件和資源打包成一個文件,便于管理和分發(fā)。
- 提高性能 :使用壓縮技術(shù)減少文件體積,提升加載速度。
- 安全控制 :支持數(shù)字簽名,保障代碼完整性。
- 支持清單文件 :通過
MANIFEST.MF文件可以指定主類、依賴庫等信息。
優(yōu)勢:
| 優(yōu)勢 | 描述 |
|---|---|
| 易于分發(fā) | 一個JAR文件即可發(fā)布整個Java應(yīng)用 |
| 節(jié)省空間 | 使用壓縮算法減少文件體積 |
| 可執(zhí)行性 | 通過配置主類,JAR文件可直接運行 |
| 模塊化 | 支持構(gòu)建模塊化應(yīng)用程序,便于依賴管理 |
3.1.2 使用jar命令打包Java程序
Java SDK 提供了 jar 工具,用于創(chuàng)建、查看、更新 JAR 文件。其基本語法如下:
jar [選項] [jar文件名] [-C 目錄] 文件列表
打包一個簡單Java程序
假設(shè)我們有一個簡單的Java類 HelloWorld.java ,內(nèi)容如下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, JAR World!");
}
}
編譯后生成 HelloWorld.class ,我們可以使用以下命令打包為JAR文件:
javac HelloWorld.java jar cvf HelloWorld.jar HelloWorld.class
參數(shù)說明:
c:創(chuàng)建新的JAR文件。v:在標準輸出中生成詳細輸出(verbose)。f:指定JAR文件名。HelloWorld.jar:輸出的JAR文件名。HelloWorld.class:要打包的類文件。
此時會生成一個名為 HelloWorld.jar 的文件,但此時還不能直接運行,因為沒有指定主類。
附加說明:
- 使用
jar tvf HelloWorld.jar可查看JAR包內(nèi)容。 - 使用
jar xvf HelloWorld.jar可解壓JAR包。
3.2 MANIFEST.MF文件的作用
3.2.1 指定Main-Class屬性
為了讓JAR文件能夠直接運行,需要在 MANIFEST.MF 文件中指定主類(Main-Class)。這個主類必須包含 public static void main(String[] args) 方法。
示例:添加主類信息
我們可以手動創(chuàng)建一個 manifest.txt 文件,內(nèi)容如下:
Main-Class: HelloWorld
然后使用以下命令打包:
jar cvfm HelloWorld.jar manifest.txt HelloWorld.class
參數(shù)說明:
m:表示使用自定義的清單文件。
執(zhí)行JAR文件:
java -jar HelloWorld.jar
輸出結(jié)果:
Hello, JAR World!
3.2.2 自定義清單文件的編寫
除了指定主類外, MANIFEST.MF 還可以配置其他屬性,如:
- Class-Path :指定依賴的JAR文件路徑。
- Sealed :控制包是否密封,防止外部修改。
- Permissions :定義運行時權(quán)限。
示例:包含依賴的清單文件
假設(shè)你的程序依賴另一個JAR文件 lib/utils.jar ,可以在 manifest.txt 中添加:
Main-Class: HelloWorld Class-Path: lib/utils.jar
打包命令不變:
jar cvfm HelloWorld.jar manifest.txt HelloWorld.class
注意事項:
Class-Path中的路徑是相對于JAR文件的位置。- 多個依賴使用空格分隔。
清單文件結(jié)構(gòu)示例:
Manifest-Version: 1.0 Created-By: 1.8.0_292 (Oracle Corporation) Main-Class: HelloWorld Class-Path: lib/utils.jar
3.3 驗證JAR包的完整性與執(zhí)行能力
3.3.1 使用java -jar測試運行
一旦JAR文件打包完成并正確配置了 MANIFEST.MF ,就可以使用 java -jar 命令運行它。
示例:
java -jar HelloWorld.jar
如果一切配置正確,將輸出:
Hello, JAR World!
參數(shù)說明:
-jar:告訴JVM使用指定的JAR文件作為程序入口。
3.3.2 常見打包錯誤及排查方法
常見錯誤及解決方法:
| 錯誤類型 | 描述 | 解決方法 |
|---|---|---|
NoClassDefFoundError | 類文件缺失或路徑錯誤 | 檢查是否打包所有類文件,路徑是否正確 |
Could not find or load main class | 主類未指定或名稱錯誤 | 確保 MANIFEST.MF 正確指定主類,類名無拼寫錯誤 |
invalid header field | 清單文件格式錯誤 | 檢查每行末尾是否有空格或換行不規(guī)范 |
java.util.zip.ZipException | JAR文件損壞 | 重新打包,確保壓縮過程無異常 |
排查流程圖(mermaid):
graph TD
A[開始測試運行JAR] --> B{是否成功運行?}
B -- 是 --> C[運行成功]
B -- 否 --> D[查看錯誤信息]
D --> E{是否存在類加載錯誤?}
E -- 是 --> F[檢查類文件是否完整]
E -- 否 --> G{是否存在清單錯誤?}
G -- 是 --> H[檢查MANIFEST.MF格式]
G -- 否 --> I[其他錯誤,查看日志]
日志輸出建議:
在執(zhí)行 java -jar 時,可以添加 -verbose 參數(shù)查看JVM加載類的詳細過程:
java -verbose -jar HelloWorld.jar
通過本章的學習,我們了解了JAR文件的結(jié)構(gòu)、打包方式、清單文件的配置方法以及如何驗證JAR包的執(zhí)行能力。這些知識是構(gòu)建可執(zhí)行Java應(yīng)用程序的基礎(chǔ),也為后續(xù)結(jié)合BAT腳本實現(xiàn)自動化運行提供了前提條件。在下一章中,我們將深入探討B(tài)AT文件的創(chuàng)建方式及其在Windows環(huán)境中的使用規(guī)范。
4. BAT文件創(chuàng)建步驟詳解
BAT文件作為Windows系統(tǒng)下最基礎(chǔ)的腳本執(zhí)行機制,廣泛應(yīng)用于自動化部署、程序啟動、環(huán)境配置等場景。本章將深入解析BAT文件的創(chuàng)建方式、編寫規(guī)范與測試調(diào)試流程,幫助讀者掌握從零構(gòu)建批處理腳本的能力。內(nèi)容將從基礎(chǔ)操作入手,逐步引導(dǎo)到高級技巧,確保即使是5年以上經(jīng)驗的IT從業(yè)者也能從中獲得實用知識。
4.1 BAT文件的創(chuàng)建方式
BAT文件本質(zhì)上是一個文本文件,擴展名為 .bat ,通過Windows命令行解釋器cmd.exe執(zhí)行。創(chuàng)建BAT文件的核心方式有兩種:文本編輯器編寫和命令行重定向生成。
4.1.1 文本編輯器編寫并保存為.bat擴展名
這是最常見且最推薦的方式,適用于所有用戶,尤其適合初學者。步驟如下:
- 打開任意文本編輯器(如Notepad、VS Code等);
- 編寫批處理命令,例如:
@echo off echo Hello, BAT file! pause
- 保存文件,選擇“所有文件”類型,輸入文件名如
hello.bat; - 雙擊運行該文件,或在命令行中執(zhí)行。
注意:保存時務(wù)必確認擴展名為
.bat,否則系統(tǒng)不會識別為可執(zhí)行腳本。
參數(shù)說明與執(zhí)行邏輯分析
@echo off:關(guān)閉命令回顯,避免輸出冗余信息;echo Hello, BAT file!:輸出提示信息;pause:暫停腳本執(zhí)行,等待用戶按任意鍵繼續(xù),防止窗口一閃而過。
衍生討論:編碼格式的影響
BAT文件默認使用ASCII或ANSI編碼。如果使用UTF-8保存,可能導(dǎo)致執(zhí)行失敗或亂碼。建議使用Notepad++等工具將編碼設(shè)置為“ANSI”或“UTF-8 without BOM”。
示例:使用Notepad++保存BAT文件
- 打開Notepad++;
- 輸入腳本內(nèi)容;
- 點擊“編碼”菜單,選擇“轉(zhuǎn)為ANSI”;
- 保存為
.bat文件。
4.1.2 使用命令行重定向生成
在自動化部署或腳本生成腳本的場景中,我們可以通過命令行重定向的方式創(chuàng)建BAT文件。
示例:使用echo命令生成BAT文件
echo @echo off > myscript.bat echo echo This script was generated via command line >> myscript.bat echo pause >> myscript.bat
參數(shù)說明與執(zhí)行邏輯分析
echo ... > myscript.bat:將字符串寫入新文件;>>:追加寫入,避免覆蓋已有內(nèi)容;- 該方式適用于在部署流程中動態(tài)生成腳本。
衍生討論:腳本自生成技術(shù)
在大型項目部署中,BAT腳本可以作為“生成器”,根據(jù)配置文件動態(tài)生成其他BAT腳本,實現(xiàn)參數(shù)化部署。例如:
@echo off set VERSION=1.0.0 echo @echo off > deploy_v%VERSION%.bat echo echo Deploying version %VERSION% >> deploy_v%VERSION%.bat echo pause >> deploy_v%VERSION%.bat
該腳本會生成 deploy_v1.0.0.bat 文件,便于版本管理。
4.2 編寫B(tài)AT腳本的基本規(guī)范
BAT腳本雖然簡單,但在實際項目中仍需遵循一定的規(guī)范,以提升可讀性、可維護性與安全性。
4.2.1 腳本編碼與換行格式
BAT腳本的編碼格式對執(zhí)行影響較大。推薦使用ANSI編碼,避免使用UTF-8(除非明確指定)。
換行格式問題
Windows換行符為 \r\n ,而Linux為 \n 。如果BAT文件是從Linux系統(tǒng)復(fù)制過來的,可能會導(dǎo)致執(zhí)行異常。建議使用dos2unix或Notepad++轉(zhuǎn)換換行格式。
示例:Notepad++中轉(zhuǎn)換換行符
- 打開BAT文件;
- 點擊“編輯” > “EOL轉(zhuǎn)換” > “Windows格式”;
- 保存文件。
4.2.2 執(zhí)行權(quán)限與路徑問題
BAT文件的執(zhí)行權(quán)限與路徑問題常導(dǎo)致腳本無法運行,尤其是在多用戶或受限權(quán)限的環(huán)境中。
執(zhí)行權(quán)限問題
在Windows系統(tǒng)中,BAT文件默認可執(zhí)行,但某些安全策略(如組策略)可能限制執(zhí)行??赏ㄟ^以下方式排查:
echo %ERRORLEVEL%
若輸出為 '不是內(nèi)部或外部命令' ,則可能權(quán)限受限。
路徑問題
路徑問題是最常見的錯誤來源之一。BAT腳本中應(yīng)盡量使用絕對路徑,或確保相對路徑正確。
示例:路徑問題演示
@echo off cd /d D:\project\bin java -jar myapp.jar
cd /d:切換驅(qū)動器和目錄;D:\project\bin:必須存在且包含myapp.jar;- 若路徑中包含空格,需用引號包裹:
cd /d "D:\my project\bin"
衍生討論:環(huán)境變量與PATH設(shè)置
BAT腳本中使用 %PATH% 環(huán)境變量來調(diào)用外部程序。建議在腳本開頭設(shè)置路徑,以確保兼容性:
@echo off set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291 set PATH=%JAVA_HOME%\bin;%PATH% java -version
4.3 BAT腳本的測試與調(diào)試
BAT腳本雖為文本腳本,但其調(diào)試能力較弱。掌握測試與調(diào)試技巧是提升腳本質(zhì)量的關(guān)鍵。
4.3.1 在命令提示符中運行BAT文件
直接運行BAT文件是最基本的測試方式。步驟如下:
- 右鍵BAT文件,選擇“以管理員身份運行”;
- 或打開CMD,輸入腳本路徑并執(zhí)行;
- 觀察輸出內(nèi)容,確認執(zhí)行邏輯是否符合預(yù)期。
示例:帶參數(shù)運行BAT腳本
@echo off echo First argument is: %1 echo Second argument is: %2 pause
執(zhí)行命令:
test.bat hello world
輸出:
First argument is: hello Second argument is: world
%1~%9:表示傳入的前9個參數(shù);%*:表示所有參數(shù)。
4.3.2 捕獲執(zhí)行錯誤并分析
BAT腳本沒有內(nèi)置的調(diào)試器,但可以通過日志記錄和錯誤碼來輔助分析。
使用errorlevel獲取執(zhí)行結(jié)果
@echo off
dir invalid_folder
if %errorlevel% neq 0 (
echo Directory not found, error code: %errorlevel%
)
pause
dir invalid_folder:嘗試列出不存在的目錄;if %errorlevel% neq 0:判斷是否出錯;neq:不等于。
使用日志記錄
@echo off echo [%date% %time%] Script started >> script.log dir C:\nonexistent >> script.log 2>&1 echo [%date% %time%] Script ended >> script.log
>> script.log:將標準輸出追加到日志;2>&1:將標準錯誤重定向到標準輸出;- 該方式可記錄所有輸出內(nèi)容,便于后期分析。
4.3.3 調(diào)試技巧與工具推薦
BAT腳本調(diào)試雖原始,但可通過以下方式提升效率:
| 技巧 | 描述 |
|---|---|
echo 調(diào)試 | 輸出變量值或執(zhí)行狀態(tài) |
setlocal / endlocal | 局部變量控制,避免污染全局環(huán)境 |
call 命令 | 調(diào)用子腳本或函數(shù) |
choice 命令 | 模擬用戶交互,測試分支邏輯 |
timeout 命令 | 暫停執(zhí)行,便于觀察輸出 |
示例:使用call調(diào)用子過程
@echo off call :subroutine goto :eof :subroutine echo This is a subroutine exit /b
call :subroutine:調(diào)用標簽定義的子過程;goto :eof:防止執(zhí)行到子過程;exit /b:退出子過程。
本章小結(jié)與后續(xù)章節(jié)引導(dǎo)
通過本章的深入講解,讀者已經(jīng)掌握了BAT文件的多種創(chuàng)建方式、編寫規(guī)范以及調(diào)試技巧。這些知識為后續(xù)結(jié)合Java程序運行打下了堅實基礎(chǔ)。下一章將重點介紹 @echo off 命令的作用及其在提升用戶體驗方面的實際應(yīng)用,幫助讀者構(gòu)建更專業(yè)的批處理腳本界面。
5. 使用@echo off隱藏命令行輸出
在Windows批處理腳本中, @echo off 是一個非常常見且實用的命令。它不僅可以提升腳本的可讀性和用戶體驗,還能在自動化任務(wù)中減少不必要的輸出信息,使腳本運行更加干凈、高效。本章將深入解析 @echo off 的作用機制、在腳本中的使用方式,以及如何結(jié)合其他輸出控制命令設(shè)計交互式腳本輸出界面。
5.1@echo off命令的作用
@echo off 是Windows批處理語言中用于控制命令行回顯的語句,其作用在于關(guān)閉腳本執(zhí)行過程中命令本身的輸出。該命令在批處理腳本的開頭幾乎成為標配,尤其是在自動化腳本中使用頻繁。
5.1.1 清潔執(zhí)行界面與提升用戶體驗
當沒有使用 @echo off 時,批處理腳本執(zhí)行時會顯示每一條執(zhí)行的命令及其結(jié)果,這在調(diào)試階段可能有用,但在實際部署或用戶使用中會顯得雜亂無章。
例如,以下是一個未使用 @echo off 的BAT腳本內(nèi)容:
echo Hello, World! pause
運行結(jié)果如下:
C:\>echo Hello, World! Hello, World! C:\>pause 請按任意鍵繼續(xù). . .
可以看到,命令本身也被輸出到了控制臺。通過添加 @echo off ,可以隱藏這些命令的輸出,使界面更干凈:
@echo off echo Hello, World! pause
運行后輸出如下:
Hello, World! 請按任意鍵繼續(xù). . .
邏輯分析:
@echo off中的@符號表示該行命令本身也不輸出。echo off表示關(guān)閉后續(xù)命令的回顯。
這種輸出控制方式顯著提升了用戶界面的友好性,尤其是在自動化腳本或GUI式交互腳本中。
5.1.2 與默認命令行輸出的區(qū)別
| 特性 | 未使用 @echo off | 使用 @echo off |
|---|---|---|
| 命令輸出 | 顯示所有執(zhí)行命令 | 不顯示命令 |
| 用戶體驗 | 輸出雜亂,不適合展示 | 輸出整潔,適合正式運行 |
| 調(diào)試友好性 | 適合調(diào)試階段 | 需要手動添加 echo 查看日志 |
總結(jié):
- @echo off 主要用于正式運行腳本時隱藏命令行本身,提高用戶體驗。
- 在調(diào)試腳本時,可以暫時注釋掉該行命令,以查看執(zhí)行過程。
5.2 批處理腳本中的輸出控制
除了使用 @echo off 來隱藏命令行輸出外,還可以通過 echo 命令進行輸出控制,實現(xiàn)日志記錄、提示信息輸出等功能。
5.2.1 使用echo命令輸出信息
echo 命令用于在控制臺中輸出指定的字符串。其基本格式如下:
echo [message]
示例:
@echo off echo 正在啟動程序... timeout /t 2 >nul echo 程序啟動完成。 pause
執(zhí)行結(jié)果:
正在啟動程序... 程序啟動完成。 請按任意鍵繼續(xù). . .
邏輯分析:
- echo 正在啟動程序... :輸出提示信息。
- timeout /t 2 >nul :暫停2秒,且將輸出重定向到空設(shè)備(即不顯示任何內(nèi)容)。
- echo 程序啟動完成。 :再次輸出提示信息。
參數(shù)說明:
- timeout /t 2 :等待2秒。
- >nul :將標準輸出重定向到空設(shè)備(即不顯示任何內(nèi)容)。
5.2.2 控制腳本執(zhí)行過程中的日志輸出
在實際項目中,可以通過 echo 將日志信息輸出到文件中,以便后續(xù)查看和分析。
示例:
@echo off echo [%date% %time%] 腳本開始執(zhí)行 >> script.log echo 正在執(zhí)行任務(wù)... timeout /t 3 >nul echo [%date% %time%] 任務(wù)完成 >> script.log echo 腳本執(zhí)行完畢。 pause
輸出文件內(nèi)容(script.log):
[2025-04-05 14:23:10.45] 腳本開始執(zhí)行 [2025-04-05 14:23:13.47] 任務(wù)完成
邏輯分析:
- >> script.log :將輸出追加寫入日志文件。
- [%date% %time%] :插入當前日期和時間,便于日志追蹤。
參數(shù)說明:
- >> :追加寫入文件。
- > :覆蓋寫入文件。
- %date% 、 %time% :系統(tǒng)環(huán)境變量,分別表示當前日期和時間。
mermaid流程圖:
graph TD
A[@echo off] --> B[開始執(zhí)行]
B --> C[記錄日志到script.log]
C --> D[輸出提示信息]
D --> E[執(zhí)行任務(wù)]
E --> F[再次記錄日志]
F --> G[結(jié)束腳本]
5.3 實際應(yīng)用中的交互式輸出設(shè)計
在自動化腳本開發(fā)中,合理的輸出設(shè)計可以提升用戶與腳本之間的交互體驗,特別是在需要用戶輸入、提示信息或錯誤反饋的場景中。
5.3.1 輸出提示信息給用戶
一個良好的腳本應(yīng)具備清晰的提示信息,引導(dǎo)用戶進行下一步操作。
示例:
@echo off title Java程序啟動器 color 0a echo ===================================== echo Java程序啟動器 echo ===================================== echo. echo 正在準備啟動Java程序,請稍候... timeout /t 2 >nul echo. echo 請輸入要運行的Java程序名稱(不帶.jar): set /p jarname= echo 正在運行 %jarname%.jar... java -jar %jarname%.jar pause
邏輯分析:
- title Java程序啟動器 :設(shè)置控制臺窗口標題。
- color 0a :設(shè)置控制臺顏色為綠色文字(0為背景色,a為前景色)。
- set /p jarname= :等待用戶輸入,并將輸入內(nèi)容存儲在變量 jarname 中。
- java -jar %jarname%.jar :運行用戶輸入的JAR文件。
交互流程:
Java程序啟動器 正在準備啟動Java程序,請稍候... 請輸入要運行的Java程序名稱(不帶.jar): myapp 正在運行 myapp.jar...
5.3.2 錯誤信息的可視化提示
在腳本中,如果某些命令執(zhí)行失敗,應(yīng)通過顏色、聲音等方式提醒用戶。
示例:
@echo off color 0c echo [錯誤] 無法找到指定的JAR文件! echo 請確認文件是否存在并重試。 echo 錯誤代碼:0x0001 pause
執(zhí)行效果:
- 控制臺文字變?yōu)榧t色( color 0c )。
- 輸出錯誤信息并提示用戶。
參數(shù)說明:
- color 0c :0為黑色背景,c為紅色文字。
- 可以使用 color /? 查看所有顏色代碼。
表格:常見顏色代碼
| 顏色代碼 | 顏色描述 |
|---|---|
| 0 | 黑色 |
| 1 | 藍色 |
| 2 | 綠色 |
| 3 | 淺綠色 |
| 4 | 紅色 |
| 5 | 紫色 |
| 6 | 黃色 |
| 7 | 白色 |
| 8 | 灰色 |
| 9 | 淺藍色 |
| A | 淺綠色 |
| B | 淺淺綠色 |
| C | 淺紅色 |
| D | 淺紫色 |
| E | 淺黃色 |
| F | 亮白色 |
小結(jié):
- @echo off 是批處理腳本中提升用戶體驗的重要命令。
- echo 不僅可以輸出提示信息,還可以用于日志記錄。
- 合理使用顏色、提示、輸入交互,可以增強腳本的交互性和可讀性。
- 結(jié)合Java程序調(diào)用,BAT腳本可以構(gòu)建出完整的自動化運行環(huán)境。
6.java -jar命令運行JAR文件
java -jar 是 Java 開發(fā)者最常使用的命令之一,用于執(zhí)行打包好的 JAR 文件。它不僅簡化了 Java 程序的部署流程,也提升了程序運行的一致性和可移植性。本章將深入講解 java -jar 命令的使用方法、運行機制、常見問題及解決方案,幫助開發(fā)者在實際項目中高效、穩(wěn)定地使用 JAR 文件進行部署和運行。
6.1 Java運行時環(huán)境的配置
在使用 java -jar 執(zhí)行 JAR 文件之前,必須確保系統(tǒng)中已正確安裝 Java 運行時環(huán)境(JRE)或 Java 開發(fā)工具包(JDK),并完成環(huán)境變量的配置。
6.1.1 安裝JRE與配置環(huán)境變量
Java 運行時環(huán)境(JRE)是運行 Java 程序所必需的基礎(chǔ)組件。安裝 JRE 或 JDK 后,需將 bin 目錄路徑添加到系統(tǒng)環(huán)境變量 PATH 中,以便在任意目錄下運行 java 命令。
安裝步驟(以 Windows 系統(tǒng)為例):
下載并安裝 JDK 或 JRE
從 Oracle 官網(wǎng)或 Adoptium 等開源社區(qū)下載適合當前系統(tǒng)的 JDK 安裝包。配置環(huán)境變量
- 右鍵“此電腦” → “屬性” → “高級系統(tǒng)設(shè)置” → “環(huán)境變量”。
- 在“系統(tǒng)變量”中找到Path,點擊“編輯”。
- 添加 JDK 的bin路徑,例如:C:\Program Files\Java\jdk-17.0.1\bin驗證安裝
打開命令提示符(CMD)并輸入以下命令:
java -version javac -version
如果輸出類似如下內(nèi)容,說明安裝成功:
java version "17.0.1" 2021-10-19 LTS Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39) Java HotSpot(TM) 64-Bit Server VM (build 35.1+12-LTS, mixed mode, sharing)
參數(shù)說明 :
-java -version:顯示當前 Java 運行時版本。
-javac -version:顯示編譯器版本,僅 JDK 安裝后可用。
6.1.2 驗證Java版本與路徑
在使用 java -jar 前,建議檢查當前使用的 Java 版本是否符合項目需求。例如,某些 JAR 文件可能要求 Java 11 或更高版本才能運行。
示例:查看當前 Java 可執(zhí)行文件路徑
where java
輸出示例:
C:\Program Files\Java\jdk-17.0.1\bin\java.exe
邏輯分析 :
-where命令用于查找系統(tǒng)路徑中的可執(zhí)行文件位置。
- 確保該路徑與你期望使用的 JDK 一致,避免因多個 Java 版本導(dǎo)致沖突。
6.2java -jar命令的使用方法
java -jar 命令用于運行一個打包好的 JAR 文件。其基本語法如下:
java -jar [選項] jarfile [args...]
其中:
- jarfile 是 JAR 文件的路徑。
- args... 是傳遞給 Java 程序的命令行參數(shù)。
6.2.1 執(zhí)行已打包的JAR文件
示例:運行一個名為app.jar的 JAR 文件
java -jar app.jar
邏輯分析 :
- JVM 會自動查找 JAR 文件中的META-INF/MANIFEST.MF文件。
- 如果該文件中包含Main-Class屬性,JVM 會加載該類并執(zhí)行其main方法。
MANIFEST.MF 示例:
Manifest-Version: 1.0 Main-Class: com.example.Main
參數(shù)說明 :
-Main-Class:指定程序入口類的全限定名。
- 若未指定,執(zhí)行java -jar時會拋出異常:no main manifest attribute, in app.jar
6.2.2 指定JVM參數(shù)優(yōu)化執(zhí)行
java -jar 支持在啟動時指定 JVM 參數(shù)以優(yōu)化程序性能,例如設(shè)置堆內(nèi)存大小、GC 算法等。
示例:設(shè)置堆內(nèi)存并啟用 GC 日志
java -Xms512m -Xmx2g -jar app.jar
參數(shù)說明 :
--Xms512m:初始堆內(nèi)存為 512MB。
--Xmx2g:最大堆內(nèi)存為 2GB。
- 這些參數(shù)應(yīng)根據(jù)應(yīng)用程序的實際內(nèi)存需求進行調(diào)整,避免資源浪費或內(nèi)存溢出。
示例:啟用 G1 垃圾回收器
java -XX:+UseG1GC -jar app.jar
邏輯分析 :
--XX:+UseG1GC:啟用 G1 垃圾回收器,適用于大堆內(nèi)存和低延遲場景。
- 適用于高并發(fā) Java 應(yīng)用,如 Web 服務(wù)器、大數(shù)據(jù)處理等。
6.3 運行常見問題與解決方案
盡管 java -jar 使用簡單,但在實際運行過程中仍可能出現(xiàn)各種異常。以下是常見問題及其解決方法。
6.3.1 ClassNotFoundException與類路徑問題
異常信息示例 :
Error: Could not find or load main class com.example.Main Caused by: java.lang.ClassNotFoundException: com.example.Main
原因分析 :
- MANIFEST.MF 文件中未正確指定 Main-Class 。
- 類文件未正確打包進 JAR。
- 類路徑錯誤(如未使用 -cp 指定依賴庫)。
解決方案 :
檢查 MANIFEST.MF 文件
使用jar tf app.jar查看文件結(jié)構(gòu),確認是否存在META-INF/MANIFEST.MF并正確設(shè)置Main-Class。重新打包 JAR 文件
使用jar命令指定主類重新打包:
jar cfe app.jar com.example.Main -C out/ .
參數(shù)說明 :
-cfe:創(chuàng)建 JAR 文件,e表示指定入口類。
-com.example.Main:主類全名。
-out/:編譯后的類文件路徑。
- 使用顯式類路徑運行
java -cp app.jar com.example.Main
邏輯分析 :
- 當 JAR 文件中沒有Main-Class時,可以顯式指定主類。
--cp參數(shù)用于指定類路徑,JVM 會在該路徑中查找類文件。
6.3.2 主類未定義異常的處理
異常信息示例 :
Failed to load Main-Class manifest attribute from app.jar
原因分析 :
- MANIFEST.MF 文件中缺少 Main-Class 屬性。
- 或者屬性格式錯誤(如缺少換行符、使用中文等)。
解決方案 :
- 手動創(chuàng)建 MANIFEST.MF 文件
Manifest-Version: 1.0 Main-Class: com.example.Main
- 使用 jar 命令指定清單文件
jar cfm app.jar MANIFEST.MF -C out/ .
參數(shù)說明 :
-cfm:創(chuàng)建 JAR 文件并指定清單文件。
-MANIFEST.MF:自定義清單文件路徑。
--C out/ .:將out/目錄下的所有文件打包進 JAR。
- 使用 IDE 導(dǎo)出 JAR 時指定主類
在 Eclipse 或 IntelliJ IDEA 中導(dǎo)出 JAR 文件時,選擇“Runnable JAR file”并指定主類,IDE 會自動配置 MANIFEST.MF 文件。
6.3.3 衍生討論:JAR 文件與 BAT 腳本結(jié)合運行
在實際部署場景中,開發(fā)者通常會將 java -jar 命令封裝進 BAT 腳本中,實現(xiàn)一鍵啟動、參數(shù)傳遞、日志記錄等功能。
示例:封裝java -jar到 BAT 文件中
@echo off set JAVA_HOME="C:\Program Files\Java\jdk-17.0.1" set JAR_PATH="app.jar" %JAVA_HOME%\bin\java -Xms512m -Xmx2g -jar %JAR_PATH%
邏輯分析 :
-@echo off:關(guān)閉命令回顯,提升執(zhí)行體驗。
-set JAVA_HOME:顯式指定 Java 路徑,避免系統(tǒng)路徑?jīng)_突。
-%JAVA_HOME%\bin\java:調(diào)用 Java 虛擬機執(zhí)行 JAR 文件。
示例:添加日志記錄功能
@echo off set JAVA_HOME="C:\Program Files\Java\jdk-17.0.1" set JAR_PATH="app.jar" set LOG_FILE="app.log" %JAVA_HOME%\bin\java -jar %JAR_PATH% >> %LOG_FILE% 2>&1
參數(shù)說明 :
->> %LOG_FILE%:追加標準輸出到日志文件。
-2>&1:將錯誤輸出重定向到標準輸出,統(tǒng)一記錄。
6.3.4 總結(jié)與建議
在使用 java -jar 命令運行 JAR 文件時,需確保以下幾點:
| 檢查項 | 說明 |
|---|---|
| Java 環(huán)境是否安裝 | 確保 java -version 可正常執(zhí)行 |
| JAR 文件是否完整 | 使用 jar tf 查看文件結(jié)構(gòu) |
| MANIFEST.MF 是否正確 | 必須包含 Main-Class 屬性 |
| 是否存在依賴問題 | 使用 -cp 或 Class-Path 指定依賴庫 |
| 是否使用合適的 JVM 參數(shù) | 根據(jù)應(yīng)用需求設(shè)置內(nèi)存、GC 等參數(shù) |
在實際部署中,推薦結(jié)合 BAT 腳本進行封裝,提高可維護性和自動化能力。
衍生流程圖:JAR 文件運行流程
graph TD
A[開始] --> B{是否存在JRE環(huán)境?}
B -- 是 --> C[是否已配置環(huán)境變量?]
C -- 是 --> D[執(zhí)行 java -jar]
D --> E{是否包含 Main-Class?}
E -- 是 --> F[運行程序]
E -- 否 --> G[拋出異常: Main-Class 未定義]
C -- 否 --> H[手動指定 Java 路徑]
B -- 否 --> I[安裝 JRE 或 JDK]
流程說明 :
- 從環(huán)境配置到程序執(zhí)行的全過程,幫助開發(fā)者理解運行邏輯。
- 異常路徑清晰標注,便于排查問題。
通過本章的學習,開發(fā)者應(yīng)掌握 java -jar 的基本用法、常見異常的處理方法,以及如何將其與 BAT 腳本結(jié)合用于自動化部署。下一章將深入講解如何通過指定主類全名來運行 Java 程序,并結(jié)合 BAT 實現(xiàn)更靈活的參數(shù)控制與自動化運行。
7. 指定主類全名執(zhí)行Main方法
7.1 使用java [主類全名]執(zhí)行程序
在沒有使用 JAR 文件的情況下,直接運行 Java 編譯后的 .class 文件時,需要通過 java 命令并指定主類的全名(即包含包名的類名)來執(zhí)行程序。這種方式適用于調(diào)試或測試階段,尤其在沒有打包成 JAR 文件時非常實用。
7.1.1 類路徑與類名的正確格式
要運行一個 Java 程序,必須確保:
- 類文件已經(jīng)通過
javac編譯生成.class文件; - 主類中包含標準的
public static void main(String[] args)方法; - 類路徑(class path)設(shè)置正確,以便 JVM 能找到類文件;
- 主類名稱必須包含完整的包名(如果有的話)。
例如,假設(shè)我們有如下 Java 類:
// 文件路徑:src/com/example/App.java
package com.example;
public class App {
public static void main(String[] args) {
System.out.println("Hello from App.main()");
if (args.length > 0) {
System.out.println("Received arguments: ");
for (String arg : args) {
System.out.println(arg);
}
}
}
}
編譯命令:
javac -d out src/com/example/App.java
執(zhí)行命令:
java -cp out com.example.App arg1 arg2
-cp out:指定類路徑為out目錄,JVM 將在此路徑下查找com.example.App類;com.example.App:主類全名;arg1 arg2:傳遞給 main 方法的參數(shù)。
7.1.2 不使用 JAR 文件直接運行編譯類
不使用 JAR 文件直接運行 Java 類,適合于開發(fā)階段的快速調(diào)試。這種方式不需要打包,但需要注意:
- 類路徑必須準確;
- 包結(jié)構(gòu)必須完整;
- 需要手動管理依賴類文件的路徑。
7.2 結(jié)合 BAT 腳本動態(tài)傳遞參數(shù)
在實際部署或測試中,往往需要通過腳本動態(tài)獲取參數(shù)并傳遞給 Java 程序。BAT 腳本非常適合這種場景,能夠從命令行接收參數(shù)并拼接執(zhí)行命令。
7.2.1 從命令行獲取參數(shù)并傳入 Java程序
BAT 腳本可以使用 %1 , %2 , %* 等變量來接收外部傳入的參數(shù)。
例如,編寫如下 BAT 文件:
:: run_app.bat @echo off setlocal :: 設(shè)置類路徑 set CLASSPATH=.\out :: 獲取傳入的參數(shù) set ARGS=%* :: 執(zhí)行 Java 類 java com.example.App %ARGS% endlocal
使用方式:
run_app.bat Hello World
輸出:
Hello from App.main() Received arguments: Hello World
7.2.2 動態(tài)拼接命令并執(zhí)行
更復(fù)雜的場景下,BAT 腳本可以動態(tài)拼接整個執(zhí)行命令,包括 JVM 參數(shù)、類路徑、主類名和用戶參數(shù)。
示例腳本:
:: advanced_run.bat @echo off setlocal :: 設(shè)置類路徑 set CP=.\out :: 設(shè)置 JVM 參數(shù)(可選) set JVM_OPTS=-Xms128m -Xmx512m :: 設(shè)置主類全名 set MAIN_CLASS=com.example.App :: 動態(tài)拼接完整命令 set CMD=java %JVM_OPTS% -cp %CP% %MAIN_CLASS% %* :: 執(zhí)行命令 echo Executing: %CMD% %CMD% endlocal
運行:
advanced_run.bat Test 123
輸出:
Executing: java -Xms128m -Xmx512m -cp .\out com.example.App Test 123 Hello from App.main() Received arguments: Test 123
7.3 實現(xiàn) Java 程序的自動化運行
在部署環(huán)境中,自動化運行 Java 程序是常見需求。BAT 腳本可以集成 Java 執(zhí)行、參數(shù)傳遞、日志記錄和自動重啟等功能,提高部署效率。
7.3.1 批處理腳本與 Java 程序的集成
可以將 BAT 腳本封裝為完整的啟動腳本,集成編譯、執(zhí)行、日志等功能。
示例:帶日志記錄的啟動腳本
:: auto_run.bat
@echo off
setlocal
:: 設(shè)置日志文件路徑
set LOG_FILE=app.log
:: 設(shè)置執(zhí)行參數(shù)
set CP=.\out
set MAIN_CLASS=com.example.App
set ARGS=%*
:: 執(zhí)行并記錄日志
echo [%date% %time%] Starting Java application... >> %LOG_FILE%
java -cp %CP% %MAIN_CLASS% %ARGS% >> %LOG_FILE% 2>&1
:: 檢查退出碼
if %ERRORLEVEL% equ 0 (
echo [%date% %time%] Application exited normally. >> %LOG_FILE%
) else (
echo [%date% %time%] Application exited with error code %ERRORLEVEL%. >> %LOG_FILE%
)
endlocal
該腳本將 Java 程序的輸出記錄到 app.log 文件中,并記錄啟動和退出時間及狀態(tài)。
7.3.2 程序自動重啟與日志記錄機制
可以在腳本中添加循環(huán)機制,實現(xiàn)自動重啟功能,適用于需要長時間運行的后臺程序。
:: auto_restart.bat @echo off setlocal :loop echo Starting application... java -cp .\out com.example.App echo Application exited with code %ERRORLEVEL%. Restarting in 5 seconds... timeout /t 5 >nul goto loop endlocal
該腳本會無限循環(huán)重啟 Java 程序,適用于測試環(huán)境或輕量級服務(wù)。
7.4 Windows 環(huán)境下 Java 項目的部署實踐
在企業(yè)或生產(chǎn)環(huán)境中,Java 項目的部署應(yīng)具備標準化、可維護和可擴展的特性。BAT 腳本可以作為部署工具的一部分,結(jié)合配置文件和日志系統(tǒng),實現(xiàn)高效的部署流程。
7.4.1 部署腳本的標準化設(shè)計
標準化部署腳本應(yīng)具備以下特征:
- 明確的類路徑和主類配置;
- 支持動態(tài)參數(shù)傳遞;
- 支持日志輸出與錯誤捕獲;
- 支持版本控制和更新機制;
- 支持服務(wù)化運行(如注冊為 Windows 服務(wù))。
例如,可以將配置提取到外部 .ini 文件中:
# config.ini CLASSPATH=.\out MAIN_CLASS=com.example.App JVM_OPTS=-Xms128m -Xmx512m
然后在 BAT 腳本中讀取:
:: deploy.bat
@echo off
setlocal
:: 讀取配置文件
for /f "tokens=1,2 delims==" %%a in (config.ini) do (
set %%a=%%b
)
:: 執(zhí)行 Java 程序
java %JVM_OPTS% -cp %CLASSPATH% %MAIN_CLASS%
endlocal
7.4.2 版本控制與腳本更新策略
在實際部署中,BAT 腳本和 Java 類文件都應(yīng)納入版本控制系統(tǒng)(如 Git)。每次更新后,腳本應(yīng)具備自動檢測版本、備份舊版本、更新新版本的功能。
例如,可以編寫更新腳本 update.bat :
:: update.bat @echo off setlocal set VERSION=1.0.1 set BACKUP_DIR=backup\%VERSION% echo Backing up current version to %BACKUP_DIR%... mkdir %BACKUP_DIR% copy *.class %BACKUP_DIR% echo Pulling latest code from repository... git pull origin main echo Compiling new version... javac -d out src/com/example/*.java echo Update complete. endlocal
此類腳本能有效支持自動化部署和版本管理,提升項目的可維護性。
總結(jié)
到此這篇關(guān)于Windows中使用BAT文件運行Java Main方法的文章就介紹到這了,更多相關(guān)BAT文件運行Java Main方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Actuator監(jiān)控的項目實踐
本文主要結(jié)合 Spring Boot Actuator,跟大家一起分享微服務(wù)Spring Boot Actuator 的常見用法,方便我們在日常中對我們的微服務(wù)進行監(jiān)控治理,感興趣的可以了解一下2024-01-01
Spring Boot集成Druid數(shù)據(jù)庫連接池
這篇文章主要介紹了Spring Boot集成Druid數(shù)據(jù)庫連接池,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Mybatis工具類JdbcTypeInterceptor運行時自動添加jdbcType屬性
今天小編就為大家分享一篇關(guān)于Mybatis工具類JdbcTypeInterceptor運行時自動添加jdbcType屬性,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
SpringBoot 多線程事務(wù)回滾的實現(xiàn)
本文是基于springboot的@Async注解開啟多線程,并通過自定義注解和AOP實現(xiàn)的多線程事務(wù),避免繁瑣的手動提交/回滾事務(wù),感興趣的可以了解一下2024-02-02

