java -jar與java -cp的區別

java -jar與java -cp

        • 1、情景描述
        • 2、情景分析
        • 3、兩者區別




通常情況下,我們會看到以下兩種命令啟動的Java程序:

java -jar xxx.jar [args]
java -cp xxx.jar mainclass [args]

這兩種用法有什么區別呢?

1、情景描述

1)Java打包單個類

例如,在com.test下有一個文件Hello.java,在test目錄CMD命令行下執行編譯:

javac Hello.java

com上層目錄CMD命令行執行單個類打jar包命令:

java -cvf test.jar com

2)分別執行java -jar和java -cp

執行java -jar命令:

java -jar test.jar Tom
# test.jar中沒有主清單屬性

執行java -cp命令:

java -cp test.jar com.test.Hello Tom
# Hello Tom

也就是java -jar命令執行報錯,java -cp命令執行成功。這是什么原因呢?

2、情景分析

首先jar包實際上和zip壓縮文件是一樣的,我們甚至完全可以用zip壓縮工具來壓縮com目錄,然后用java -cp com.zip com.test.Hello Tom運行。不同的是,使用java命令打出的jar包會多出來一個東西:META-INF目錄

該目錄里面有一個MANIFEST.MF文件,這個文件就是jar的主清單文件。java -jar提示“沒有主清單屬性”,就是因為主清單文件中缺失了一個屬性:Main-Class,它聲明了jar包的默認入口類,也就是java -jar運行時開始執行的類,其格式為:

Main-Class: com.test.Hello

如果我們在MANIFEST.MF文件中添加上述屬性,java -jar將執行成功。需要注意的是,該屬性冒號后面有一個空格,且屬性結束必須換行

當然,在打jar包時可以通過-e參數指定默認入口類(自動生成Main-Class屬性),在com上層目錄CMD命令行執行單個類打jar包命令:

java -cvfe test.jar com.test.Hello com

執行java -jar命令:

java -jar test.jar Tom
# Hello Tom
3、兩者區別

使用java -jar運行jar包時,虛擬機將忽略系統中的classpath配置,如果有依賴jar,需要在主清單屬性中指定,格式為:

Class-Path: xx01.jar xx02.jar org/xx03.jar

多個jar包之間使用空格隔開,其路徑是相對于當前運行jar包所在的目錄

使用java -cp運行jar包時,cp本身就是classpath的意思,依賴多個jar時,直接在命令中指定,格式為:

java -cp test.jar;xx01.jar;xx02.jar com.test.Hello

值得注意的是,多個jar包之間的分隔符在Windows上是;,而在Linux中是:

綜上所述,java -jar命令與java -cp命令的區別總結如下:

  • java -jar:用來執行可執行jar,其可執行性由jar包中的主清單屬性Main-Class決定

  • java -cp:純粹的java命令,在指定classpath下查找Java類文件并執行,使用更靈活



參考文章:https://blog.csdn.net/firstendhappy/article/details/119209167


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75945.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java】面向對象程序三板斧——如何優雅設計包、封裝數據與優化代碼塊?

🎁個人主頁:User_芊芊君子 🎉歡迎大家點贊👍評論📝收藏?文章 🔍系列專欄:【Java】內容概括 【前言】 在Java編程中,類和對象是面向對象編程的核心概念。而包(Package&am…

玩轉Docker | 使用Docker搭建Blog微博系統

玩轉Docker | 使用Docker搭建Blog微博系統 前言一、Blog介紹項目簡介主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署Blog服務下載鏡像創建容器檢查容器狀態設置權限檢查服務端口安全設置四、訪問Blog系統訪問Blog首頁登錄Blog五、總結前言 在數字…

用Java NIO模擬HTTPS

HTTPS流程 名詞解釋: R1:隨機數1 R2:隨機數2 R3:隨機數3 publicKey:公鑰 privateKey:私鑰 要提供https服務,服務端需要安裝數字證書,在(TCP建立連接之后)TLS握手時發給客戶端,客戶端驗證證書&#x…

樹莓派_利用Ubuntu搭建gitlab

樹莓派_利用Ubuntu搭建gitlab 一、給樹莓派3A搭建基本系統 1、下載系統鏡像 https://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ 2、準備系統SD卡 二、給樹莓派設備聯網 1、串口后臺登錄 使用串口登錄后臺是最便捷的,因為前期網絡可能不好直接成功 默…

Hook_Unfinished

#include <windows.h>// 假設這兩個函數是存在的 void DoRD() {} void 改堆棧cal1() {} void 改回堆棧cal1() {}__declspec(naked) void HOOKcall() {__asm{pushadnop}__asm{popadmov eax, dword ptr [esi 8]sub eax, ecxretn} }int main() {// 第一個 Hook 操作DWORD H…

數據結構(六)——紅黑樹及模擬實現

目錄 前言 紅黑樹的概念及性質 紅黑樹的效率 紅黑樹的結構 紅黑樹的插入 變色不旋轉 單旋變色 雙旋變色 插入代碼如下所示&#xff1a; 紅黑樹的查找 紅黑樹的驗證 紅黑樹代碼如下所示&#xff1a; 小結 前言 在前面的文章我們介紹了AVL這一棵完全二叉搜索樹&…

c# 數據結構 鏈表篇 有關雙向鏈表的一切

本人能力有限,如有不足還請斧正 目錄 0.雙向鏈表的好處 1.雙向鏈表的分類 2.不帶頭節點的標準雙向鏈表 節點類:有頭有尾 鏈表類:也可以有頭有尾 也可以只有頭 增 頭插 尾插 刪 查 改 遍歷 全部代碼 3.循環雙向鏈表 節點類 鏈表類 增 頭插 尾插 刪 查 遍歷…

Numba 從零基礎到實戰:解鎖 Python 性能新境界

Numba 從零基礎到實戰&#xff1a;解鎖 Python 性能新境界 一、引言 在 Python 的世界里&#xff0c;性能一直是一個備受關注的話題。Python 以其簡潔易讀的語法和豐富的庫生態&#xff0c;深受開發者喜愛&#xff0c;但在處理一些計算密集型任務時&#xff0c;其執行速度往往…

單位門戶網站被攻擊后的安全防護策略

政府網站安全現狀與挑戰 近年來&#xff0c;隨著數字化進程的加速&#xff0c;政府門戶網站已成為政務公開和服務公眾的重要窗口。然而&#xff0c;網絡安全形勢卻日益嚴峻。國家互聯網應急中心的數據顯示&#xff0c;政府網站已成為黑客攻擊的重點目標&#xff0c;被篡改和被…

Spring Boot 項目三種打印日志的方法詳解。Logger,log,logger 解讀。

目錄 一. 打印日志的常見三種方法&#xff1f; 1.1 手動創建 Logger 對象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用頻率較低&#xff09; 二. 常見的 Logger&#xff0c;logger&#xff0c;…

NI的LABVIEW工具安裝及卸載步驟說明

一.介紹 最近接到個轉交的項目&#xff0c;項目主要作為上位機工具開發&#xff0c;在對接下位機時&#xff0c;有用到NI的labview工具。labview軟件是由美國國家儀器&#xff08;NI&#xff09;公司研制開發的一種程序開發環境&#xff0c;主要用于汽車測試、數據采集、芯片測…

cmd 終端輸出亂碼問題 |Visual Studio 控制臺輸出中文亂碼解決

在網上下載&#xff0c;或者移植別人的代碼到自己的電腦&#xff0c;使用VS運行后&#xff0c;控制臺輸出中文可能出現亂碼。這是因為源代碼的編碼格式和控制臺的編碼格式不一致。 文章目錄 查看源代碼文件編碼格式查看輸出控制臺編碼格式修改編碼格式修改終端代碼頁 補充總結 …

A009-基于pytest的網易云自動化測試

題 目 :基于pytest的網易云自動化測試 主要內容 綜合應用所學的軟件測試理論和方法,實現網易云的功能自動化測試。 (1)自動化測試介紹; (2)自動化功能測試框架介紹; (3)設計功能測試用例 (4)書寫自動化測試腳本; (5)測試評價與結論。 任務要求 (1)能…

LVGL Video控件和Radiobtn控件詳解

LVGL Video控件和Radiobtn控件詳解 一、 Video控件詳解1. 概述2. 創建和初始化3. 基本屬性設置4. 視頻控制5. 回調函數6. 高級功能7. 注意事項 二、Radiobtn控件詳解1. 概述2. 創建和初始化3. 屬性設置4. 狀態控制5. 組管理6. 事件處理7. 樣式設置8. 注意事項 三、效果展示四、…

AbortController:讓異步操作隨時說停就停

AbortController&#xff1a;讓異步操作隨時說停就停 一、什么是 AbortController&#xff1f; AbortController 是 JavaScript 在瀏覽器和部分 Node.js 環境中提供的全局類&#xff0c;用來中止正在進行或待完成的異步操作&#xff08;如 fetch() 請求、事件監聽、可寫流、數…

機器學習 從入門到精通 day_04

1. 決策樹-分類 1.1 概念 1. 決策節點 通過條件判斷而進行分支選擇的節點。如&#xff1a;將某個樣本中的屬性值(特征值)與決策節點上的值進行比較&#xff0c;從而判斷它的流向。 2. 葉子節點 沒有子節點的節點&#xff0c;表示最終的決策結果。 3. 決策樹的…

C++ Primer (第五版)-第十三章 拷貝控制

文章目錄 概述13.1拷貝、賦值與銷毀合成拷貝構造函數拷貝初始化參數和返回值拷貝初始化的限制編譯器可以繞過拷貝構造函數拷貝運算符析構函數三/五原則使用default阻止拷貝合成的拷貝控制成員可能是刪除的 private拷貝控制拷貝控制和資源管理行為像值的類類值拷貝賦值運算符定義…

Vue el-from的el-form-item v-for循環表單如何校驗rules(一)

實際業務需求場景&#xff1a; 新增或編輯頁面&#xff08;基礎信息表單&#xff0c;一個數據列表的表單&#xff09;&#xff0c;數據列表里面的表單數是動態添加的。數據可新增、可刪除&#xff0c;在表單保存前&#xff0c;常常需要做表單必填項的校驗&#xff0c;校驗通過以…

測試100問:http和https的區別是什么?

哈嘍&#xff0c;大家好&#xff0c;我是十二&#xff0c;今天給大家分享的問題是&#xff1a;http和https的區別是什么&#xff1f; 首先我們要知道 HTTP 協議傳播的數據都是未加密的&#xff0c;也就是明文的&#xff0c;因此呢使用 http協議傳輸一些隱私信息也就非常不安全&…

YOLOv3超詳細解讀(三):源碼解析:數據處理模塊

一、概述 YOLOv3&#xff08;You Only Look Once v3&#xff09;是一種高效的目標檢測算法&#xff0c;其數據處理模塊是訓練和推理流程的核心部分。本文將深入分析Ultralytics團隊基于PyTorch實現的YOLOv3源碼中的數據處理模塊&#xff0c;重點探討數據加載、預處理和數據增強…