Java 中間件Dubbo 服務(wù)降級(jí)以及Mock 機(jī)制詳解

在現(xiàn)代分布式系統(tǒng)中,微服務(wù)架構(gòu)已成為主流。隨著服務(wù)數(shù)量的激增,系統(tǒng)之間的依賴關(guān)系變得異常復(fù)雜。一個(gè)服務(wù)的故障可能引發(fā)連鎖反應(yīng),導(dǎo)致整個(gè)系統(tǒng)雪崩。為了提升系統(tǒng)的容錯(cuò)能力和可用性,服務(wù)降級(jí)(Service Degradation)成為不可或缺的保障機(jī)制。
Apache Dubbo 作為一款高性能、輕量級(jí)的開(kāi)源 Java RPC 框架,自誕生以來(lái)就廣泛應(yīng)用于企業(yè)級(jí)微服務(wù)架構(gòu)中。Dubbo 不僅提供了強(qiáng)大的服務(wù)治理能力,還內(nèi)置了完善的服務(wù)降級(jí)機(jī)制——即 Mock 機(jī)制。通過(guò) Mock,我們可以在服務(wù)不可用時(shí)提供備用邏輯,避免調(diào)用方因依賴服務(wù)失敗而崩潰,從而保障核心業(yè)務(wù)的連續(xù)性。
本文將深入探討 Dubbo 的 Mock 機(jī)制,從原理、配置方式、使用場(chǎng)景到實(shí)戰(zhàn)案例,全面解析如何利用這一特性構(gòu)建高可用的微服務(wù)系統(tǒng)。無(wú)論你是 Dubbo 初學(xué)者,還是已有一定經(jīng)驗(yàn)的開(kāi)發(fā)者,相信都能從中獲得實(shí)用的知識(shí)和啟發(fā)。
什么是服務(wù)降級(jí)?
在討論 Dubbo 的 Mock 機(jī)制之前,我們先明確“服務(wù)降級(jí)”的概念。
服務(wù)降級(jí)是指在系統(tǒng)資源緊張或依賴服務(wù)不可用時(shí),主動(dòng)關(guān)閉或簡(jiǎn)化非核心功能,優(yōu)先保障核心業(yè)務(wù)正常運(yùn)行的一種容錯(cuò)策略。
想象一下電商大促場(chǎng)景:當(dāng)用戶下單時(shí),系統(tǒng)需要調(diào)用庫(kù)存服務(wù)、優(yōu)惠券服務(wù)、積分服務(wù)等多個(gè)下游服務(wù)。如果此時(shí)積分服務(wù)因高并發(fā)而響應(yīng)緩慢甚至超時(shí),若不加處理,用戶的整個(gè)下單流程將被阻塞,最終可能導(dǎo)致訂單失敗。這不僅影響用戶體驗(yàn),還可能造成直接的經(jīng)濟(jì)損失。
此時(shí),服務(wù)降級(jí)就派上用場(chǎng)了。我們可以對(duì)積分服務(wù)進(jìn)行降級(jí):暫時(shí)跳過(guò)積分計(jì)算邏輯,直接返回“本次購(gòu)物不計(jì)積分”,但允許訂單繼續(xù)完成。這樣,雖然犧牲了非核心功能(積分),卻保障了核心功能(下單)的可用性。
服務(wù)降級(jí)的核心思想是:“有損服務(wù)”優(yōu)于“完全不可用”。
在 Dubbo 中,這種降級(jí)能力主要通過(guò) Mock 機(jī)制實(shí)現(xiàn)。
Dubbo Mock 機(jī)制簡(jiǎn)介
Dubbo 的 Mock 機(jī)制是一種客戶端容錯(cuò)策略,它允許我們?cè)诜?wù)調(diào)用失敗(如超時(shí)、網(wǎng)絡(luò)異常、服務(wù)不可用等)時(shí),執(zhí)行預(yù)定義的備用邏輯,而不是直接拋出異常。
?? 關(guān)鍵點(diǎn):Mock 是在**消費(fèi)者端(Consumer)**生效的,由調(diào)用方控制,無(wú)需服務(wù)提供方(Provider)做任何改動(dòng)。
Dubbo 支持多種 Mock 配置方式:
- 返回固定值(如
return null、return {"code": 200, "data": "mock"}) - 執(zhí)行自定義 Mock 類(lèi)
- 強(qiáng)制使用 Mock(即使服務(wù)正常也走 Mock)
這些配置可以通過(guò) XML、注解、API 或配置中心動(dòng)態(tài)設(shè)置,非常靈活。
Mock 的觸發(fā)條件
默認(rèn)情況下,Mock 僅在以下情況觸發(fā):
- 調(diào)用超時(shí)(Timeout)
- 網(wǎng)絡(luò)異常(如連接失?。?/li>
- 服務(wù)提供者不可用(如無(wú)可用 Provider)
?? 注意:業(yè)務(wù)異常(如服務(wù)端拋出 RuntimeException)不會(huì)觸發(fā) Mock。因?yàn)?Dubbo 認(rèn)為這是業(yè)務(wù)邏輯的一部分,而非調(diào)用失敗。如果你希望業(yè)務(wù)異常也觸發(fā)降級(jí),需要在服務(wù)端將異常包裝為
RpcException,或在消費(fèi)端捕獲后手動(dòng)處理。
Dubbo Mock 的配置方式
Dubbo 提供了多種配置 Mock 的方式,下面我們逐一介紹,并附上代碼示例。
1. XML 配置方式
這是最傳統(tǒng)的配置方式,適用于基于 Spring XML 的項(xiàng)目。
<!-- consumer.xml -->
<dubbo:reference id="userService"
interface="com.example.UserService"
mock="return null" />上述配置表示:當(dāng) UserService 調(diào)用失敗時(shí),直接返回 null。
如果需要返回復(fù)雜對(duì)象,可以使用 JSON 格式:
<dubbo:reference id="orderService"
interface="com.example.OrderService"
mock="return {"orderId":"MOCK_123","status":"SUCCESS"}" />?? 注意:JSON 中的雙引號(hào)需轉(zhuǎn)義為
"。
2. 注解配置方式(推薦)
在 Spring Boot + Dubbo 的現(xiàn)代項(xiàng)目中,注解方式更為簡(jiǎn)潔。
@DubboReference(mock = "return null") private UserService userService;
或者返回固定對(duì)象:
@DubboReference(mock = "return {\"userId\":0,\"name\":\"Mock User\"}")
private UserService userService;
3. 自定義 Mock 類(lèi)
對(duì)于復(fù)雜的降級(jí)邏輯(如記錄日志、返回緩存數(shù)據(jù)、調(diào)用備用服務(wù)等),我們需要實(shí)現(xiàn)自定義 Mock 類(lèi)。
步驟如下:
- 創(chuàng)建一個(gè)類(lèi),實(shí)現(xiàn)目標(biāo)接口
- 在類(lèi)名后加上
Mock后綴(Dubbo 約定) - 在該類(lèi)中實(shí)現(xiàn)降級(jí)邏輯
// 原始接口
public interface UserService {
User getUserById(Long id);
}
// Mock 實(shí)現(xiàn)類(lèi):必須與接口同包,且類(lèi)名為 接口名 + Mock
public class UserServiceMock implements UserService {
@Override
public User getUserById(Long id) {
// 降級(jí)邏輯:記錄日志 + 返回默認(rèn)用戶
System.err.println("UserService 調(diào)用失敗,啟用 Mock 降級(jí)!ID: " + id);
return new User(0L, "Default Mock User", "mock@example.com");
}
}然后在消費(fèi)端引用時(shí)指定 Mock 類(lèi):
@DubboReference(mock = "true") // 或 mock = "com.example.UserServiceMock" private UserService userService;
? 當(dāng)
mock="true"時(shí),Dubbo 會(huì)自動(dòng)查找接口名 + Mock的類(lèi)。
4. 強(qiáng)制 Mock(force)
有時(shí)我們需要強(qiáng)制使用 Mock,即使服務(wù)正常也走降級(jí)邏輯。這在測(cè)試或灰度發(fā)布時(shí)非常有用。
@DubboReference(mock = "force:return null") private UserService userService;
或使用自定義類(lèi):
@DubboReference(mock = "force:com.example.UserServiceMock") private UserService userService;
force: 前綴告訴 Dubbo:無(wú)論服務(wù)是否可用,都執(zhí)行 Mock 邏輯。
Mock 機(jī)制的工作原理
理解 Dubbo Mock 的內(nèi)部機(jī)制,有助于我們更好地使用它。
當(dāng) Dubbo 消費(fèi)者發(fā)起一次遠(yuǎn)程調(diào)用時(shí),會(huì)經(jīng)過(guò)一系列 Filter(過(guò)濾器)。其中,MockClusterInvoker 是負(fù)責(zé)處理 Mock 邏輯的關(guān)鍵組件。
其工作流程如下:

從圖中可以看出:
- 如果未配置 Mock,直接走正常調(diào)用。
- 如果配置了普通 Mock(無(wú)
force),先嘗試正常調(diào)用,失敗后再走 Mock。 - 如果配置了
force,則跳過(guò)正常調(diào)用,直接執(zhí)行 Mock。
Dubbo 通過(guò) SPI(Service Provider Interface)機(jī)制加載 Mock 實(shí)現(xiàn),保證了擴(kuò)展性和靈活性。
實(shí)戰(zhàn)案例:電商系統(tǒng)中的服務(wù)降級(jí)
下面我們通過(guò)一個(gè)完整的電商系統(tǒng)案例,演示如何在真實(shí)場(chǎng)景中使用 Dubbo Mock 機(jī)制。
場(chǎng)景描述
假設(shè)我們有一個(gè)訂單服務(wù)(OrderService),它依賴以下服務(wù):
- 用戶服務(wù)(UserService):獲取用戶信息
- 庫(kù)存服務(wù)(InventoryService):檢查商品庫(kù)存
- 積分服務(wù)(PointsService):下單后增加用戶積分
在高并發(fā)場(chǎng)景下,積分服務(wù)可能成為瓶頸。我們希望在積分服務(wù)不可用時(shí),跳過(guò)積分邏輯,但允許訂單創(chuàng)建成功。
1. 定義服務(wù)接口
// UserService.java
public interface UserService {
User getUserById(Long userId);
}
// InventoryService.java
public interface InventoryService {
boolean checkStock(Long productId, int quantity);
}
// PointsService.java
public interface PointsService {
void addPoints(Long userId, int points);
}2. 實(shí)現(xiàn) Mock 降級(jí)邏輯
為 PointsService 創(chuàng)建 Mock 類(lèi):
// PointsServiceMock.java
public class PointsServiceMock implements PointsService {
private static final Logger logger = LoggerFactory.getLogger(PointsServiceMock.class);
@Override
public void addPoints(Long userId, int points) {
// 降級(jí)策略:記錄警告日志,不拋出異常
logger.warn("PointsService 不可用,跳過(guò)積分增加。User: {}, Points: {}", userId, points);
// 可選:將積分任務(wù)寫(xiě)入消息隊(duì)列,后續(xù)補(bǔ)償
// mqProducer.send(new PointsTask(userId, points));
}
}?? 這里我們選擇“靜默降級(jí)”——不中斷主流程,僅記錄日志。也可以根據(jù)業(yè)務(wù)需求,將積分任務(wù)異步化(如寫(xiě)入 MQ),待服務(wù)恢復(fù)后補(bǔ)償。
3. 在 OrderService 中注入依賴
@Service
public class OrderServiceImpl implements OrderService {
@DubboReference
private UserService userService;
@DubboReference
private InventoryService inventoryService;
@DubboReference(mock = "true") // 啟用 Mock
private PointsService pointsService;
@Override
public Order createOrder(CreateOrderRequest request) {
// 1. 驗(yàn)證用戶
User user = userService.getUserById(request.getUserId());
if (user == null) {
throw new BusinessException("用戶不存在");
}
// 2. 檢查庫(kù)存
if (!inventoryService.checkStock(request.getProductId(), request.getQuantity())) {
throw new BusinessException("庫(kù)存不足");
}
// 3. 創(chuàng)建訂單(核心邏輯)
Order order = saveOrderToDB(request);
// 4. 增加積分(非核心,可降級(jí))
try {
pointsService.addPoints(user.getId(), 100);
} catch (Exception e) {
// 即使 Mock 失敗(理論上不會(huì)),也不影響訂單
logger.error("積分增加異常(已降級(jí))", e);
}
return order;
}
}4. 配置超時(shí)時(shí)間(可選)
為了讓 Mock 更容易觸發(fā),我們可以適當(dāng)縮短超時(shí)時(shí)間:
@DubboReference(mock = "true", timeout = 500) // 500ms 超時(shí) private PointsService pointsService;
5. 測(cè)試驗(yàn)證
- 正常情況:積分服務(wù)可用 → 用戶獲得積分。
- 異常情況:關(guān)閉積分服務(wù) → 訂單仍能創(chuàng)建成功,日志記錄降級(jí)信息。
通過(guò)這種方式,我們實(shí)現(xiàn)了核心鏈路與非核心鏈路的解耦,極大提升了系統(tǒng)穩(wěn)定性。
高級(jí)用法:動(dòng)態(tài)配置 Mock
在生產(chǎn)環(huán)境中,我們可能希望動(dòng)態(tài)開(kāi)啟或關(guān)閉 Mock,而無(wú)需重啟服務(wù)。Dubbo 支持通過(guò)配置中心(如 Nacos、ZooKeeper)實(shí)現(xiàn)這一點(diǎn)。
使用 Nacos 動(dòng)態(tài)配置 Mock
- 在
application.properties中配置 Nacos:
dubbo.config-center.address=nacos://127.0.0.1:8848
- 在 Nacos 控制臺(tái)添加配置:
Data ID: dubbo-consumer-config Group: DUBBO Content: dubbo.reference.com.example.PointsService.mock=true
- 消費(fèi)端代碼保持不變:
@DubboReference private PointsService pointsService; // 無(wú)需硬編碼 mock
當(dāng) Nacos 中的配置變更時(shí),Dubbo 會(huì)自動(dòng)刷新引用,啟用或禁用 Mock。
?? 你可以參考 Nacos 官方文檔 了解如何搭建配置中心。
這種動(dòng)態(tài)能力使得運(yùn)維人員可以在大促期間一鍵降級(jí)非核心服務(wù),活動(dòng)結(jié)束后再恢復(fù),非常靈活。
Mock 與其他容錯(cuò)機(jī)制的對(duì)比
Dubbo 提供了多種集群容錯(cuò)策略,Mock 只是其中之一。下面我們對(duì)比幾種常見(jiàn)策略:
| 策略 | 說(shuō)明 | 適用場(chǎng)景 |
|---|---|---|
| Failover(默認(rèn)) | 失敗自動(dòng)切換,重試其他服務(wù)器 | 讀操作,冪等寫(xiě) |
| Failfast | 快速失敗,只發(fā)起一次調(diào)用 | 非冪等寫(xiě)(如新增記錄) |
| Failsafe | 失敗安全,忽略異常 | 寫(xiě)入審計(jì)日志等非關(guān)鍵操作 |
| Failback | 失敗自動(dòng)恢復(fù),后臺(tái)定時(shí)重發(fā) | 消息通知等最終一致性場(chǎng)景 |
| Forking | 并行調(diào)用多個(gè)服務(wù)器,任一成功即返回 | 實(shí)時(shí)性要求高的讀操作 |
| Broadcast | 廣播調(diào)用所有提供者 | 通知所有節(jié)點(diǎn)更新緩存 |
| Mock | 調(diào)用失敗時(shí)返回 Mock 數(shù)據(jù) | 服務(wù)降級(jí)、兜底邏輯 |
?? 可以看出,Mock 的核心價(jià)值在于“提供備用響應(yīng)”,而非“重試”或“忽略”。它更適合需要返回有效數(shù)據(jù)(即使是假數(shù)據(jù))的場(chǎng)景。
例如:
- 用戶頭像服務(wù)不可用 → 返回默認(rèn)頭像(Mock)
- 推薦服務(wù)不可用 → 返回?zé)衢T(mén)商品列表(Mock)
- 而日志上報(bào)失敗 → 直接忽略(Failsafe)
選擇合適的策略,是構(gòu)建健壯系統(tǒng)的關(guān)鍵。
常見(jiàn)問(wèn)題與最佳實(shí)踐
在實(shí)際使用 Dubbo Mock 時(shí),開(kāi)發(fā)者常遇到一些問(wèn)題。以下是總結(jié)的最佳實(shí)踐:
? 問(wèn)題1:Mock 沒(méi)有生效?
可能原因:
- Mock 類(lèi)未放在與接口相同的包下
- 類(lèi)名不符合
接口名 + Mock規(guī)范 - 配置了
mock="true"但未實(shí)現(xiàn) Mock 類(lèi) - 業(yè)務(wù)異常未被識(shí)別為“調(diào)用失敗”
解決方案:
- 檢查包路徑和類(lèi)名
- 使用
mock="com.example.XxxMock"顯式指定 - 對(duì)于業(yè)務(wù)異常,考慮在 Provider 端拋出
RpcException
? 問(wèn)題2:如何 Mock 返回復(fù)雜對(duì)象?
Dubbo 支持 JSON 格式的字符串返回,但需注意:
- 字段名必須與 Java 對(duì)象一致
- 嵌套對(duì)象需完整寫(xiě)出
- 枚舉類(lèi)型需用字符串表示
@DubboReference(mock = "return {\"status\":\"SUCCESS\",\"data\":{\"id\":1,\"name\":\"Test\"}}")
private OrderService orderService;
對(duì)于極其復(fù)雜的對(duì)象,建議使用自定義 Mock 類(lèi),通過(guò)代碼構(gòu)造。
? 問(wèn)題3:Mock 是否會(huì)影響性能?
Mock 本身開(kāi)銷(xiāo)極小,因?yàn)樗辉谡{(diào)用失敗時(shí)執(zhí)行。但需注意:
- 自定義 Mock 類(lèi)中避免耗時(shí)操作(如數(shù)據(jù)庫(kù)查詢)
- 不要在 Mock 中發(fā)起新的 Dubbo 調(diào)用(可能引發(fā)循環(huán)降級(jí))
? 最佳實(shí)踐總結(jié)
- 明確降級(jí)邊界:只對(duì)非核心服務(wù)降級(jí),核心服務(wù)(如支付)不應(yīng)降級(jí)。
- 提供有意義的 Mock 數(shù)據(jù):避免返回
null導(dǎo)致 NPE,盡量返回默認(rèn)值。 - 記錄降級(jí)日志:便于監(jiān)控和告警。
- 結(jié)合熔斷機(jī)制:Mock + Sentinel/Hystrix 可實(shí)現(xiàn)更智能的降級(jí)(如錯(cuò)誤率超過(guò)閾值自動(dòng)降級(jí))。
- 定期演練:通過(guò) Chaos Engineering 驗(yàn)證降級(jí)邏輯是否有效。
?? 阿里巴巴 Sentinel 是一款優(yōu)秀的流量控制組件,可與 Dubbo 無(wú)縫集成,實(shí)現(xiàn)熔斷降級(jí)。參考 Sentinel 官網(wǎng)。
Mock 與全鏈路壓測(cè)
在大型互聯(lián)網(wǎng)公司,全鏈路壓測(cè)是保障大促穩(wěn)定的重要手段。Mock 機(jī)制在此過(guò)程中也扮演關(guān)鍵角色。
例如,在壓測(cè)環(huán)境:
- 真實(shí)用戶流量打到生產(chǎn)環(huán)境
- 但某些下游服務(wù)(如短信、支付)不能真實(shí)調(diào)用
此時(shí),可通過(guò)配置 force:mock,讓這些服務(wù)始終返回模擬響應(yīng),既不影響主鏈路,又避免了資損。
// 壓測(cè)環(huán)境專用配置 @DubboReference(mock = "force:com.example.PaymentServiceMock") private PaymentService paymentService;
Mock 類(lèi)中返回“支付成功”,但實(shí)際不扣款。這種“影子流量”技術(shù),是大廠高可用架構(gòu)的標(biāo)配。
總結(jié)
Dubbo 的 Mock 機(jī)制是構(gòu)建高可用微服務(wù)系統(tǒng)的利器。它通過(guò)客戶端降級(jí)的方式,在依賴服務(wù)不可用時(shí)提供兜底邏輯,有效防止了故障蔓延。
本文從原理、配置、實(shí)戰(zhàn)到最佳實(shí)踐,全面介紹了 Mock 的使用方法。關(guān)鍵要點(diǎn)包括:
- Mock 是消費(fèi)者端的容錯(cuò)策略
- 支持返回固定值或自定義邏輯
- 可通過(guò)配置中心動(dòng)態(tài)開(kāi)關(guān)
- 應(yīng)與業(yè)務(wù)場(chǎng)景緊密結(jié)合,避免濫用
在微服務(wù)架構(gòu)日益復(fù)雜的今天,“設(shè)計(jì)時(shí)就考慮失敗” 已成為共識(shí)。Dubbo Mock 正是這一理念的優(yōu)秀實(shí)踐。
?? 記?。合到y(tǒng)的穩(wěn)定性,不在于它在正常時(shí)有多快,而在于它在異常時(shí)有多穩(wěn)。
希望本文能幫助你更好地理解和應(yīng)用 Dubbo 服務(wù)降級(jí)。如果你有任何問(wèn)題或經(jīng)驗(yàn)分享,歡迎在評(píng)論區(qū)交流!
參考資料
通過(guò)合理運(yùn)用 Dubbo Mock 機(jī)制,我們可以讓系統(tǒng)在風(fēng)雨中依然穩(wěn)健前行。
到此這篇關(guān)于Java 中間件Dubbo 服務(wù)降級(jí)以及Mock 機(jī)制詳解的文章就介紹到這了,更多相關(guān)java dubbo 服務(wù)降級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-plus配置多數(shù)據(jù)源,連接多數(shù)據(jù)庫(kù)方式
這篇文章主要介紹了Mybatis-plus配置多數(shù)據(jù)源,連接多數(shù)據(jù)庫(kù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)服務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
java實(shí)現(xiàn)客戶信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)客戶信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
基于spring boot 2和shiro實(shí)現(xiàn)身份驗(yàn)證案例
這篇文章主要介紹了基于spring boot 2和shiro實(shí)現(xiàn)身份驗(yàn)證案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java動(dòng)態(tài)規(guī)劃之硬幣找零問(wèn)題實(shí)現(xiàn)代碼
這篇文章主要介紹了Java動(dòng)態(tài)規(guī)劃之硬幣找零問(wèn)題實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Java版數(shù)據(jù)結(jié)構(gòu)插入數(shù)據(jù)時(shí)遇到的結(jié)點(diǎn)為空的問(wèn)題詳解
這篇文章主要介紹了Java版數(shù)據(jù)結(jié)構(gòu)插入數(shù)據(jù)時(shí)遇到的結(jié)點(diǎn)為空的問(wèn)題及解決辦法,需要的朋友們可以學(xué)習(xí)下。2019-09-09
JDK10新特性之var泛型和多個(gè)接口實(shí)現(xiàn)方法
這篇文章主要介紹了JDK10的新特性:var泛型和多個(gè)接口實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
java運(yùn)行windows的cmd命令簡(jiǎn)單代碼
這篇文章主要介紹了java運(yùn)行windows的cmd命令簡(jiǎn)單代碼,有需要的朋友可以參考一下2013-12-12
IDEA如何將Java項(xiàng)目打包成可執(zhí)行的Jar包
在Java開(kāi)發(fā)中,我們通常會(huì)將我們的項(xiàng)目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運(yùn)行,本文將介紹如何使用IDEA集成開(kāi)發(fā)環(huán)境將Java項(xiàng)目打包成可執(zhí)行的Jar包,感興趣的朋友一起看看吧2023-07-07

