javac、java和jar命令

javac、java和jar命令

背景

我是一個java程序員,平時運行編譯,打包和運行程序都是由IDE或Maven來完成,應用上線部署都是由其他人來寫Shell或bat啓動停止腳本,有一天讓我把一個後臺應用打包jar在Linxu或Window部署運行我竟然蒙B了,好半天才想起來javac、java和jar命令。

javac命令

javac命令的作用是將java文件編譯爲class文件。
用法javac <options> <source files>
options爲命令選項。
source files爲需要編譯的java文件或所在的目錄,多個java文件或目錄用空格分隔。
常用命令選項
-d:指定存放生成的class文件路徑
-s:指定需要編譯的java文件或所在路徑
-encoding:指定java文件使用的字符編碼。一般都會指定utf-8編碼,否則輸出的中文是亂碼。
-cp:是-classpath的縮寫。指定編譯依賴的class文件所在的classpath路徑、jar、zip。多個路徑、jar、zip使用分號(;)分隔。

java命令

java命令用於運行class文件。
用法:執行類java [-options] class [args...]
執行jar文件java [-options] -jar jarfile [args...]
options表示命令選項。
class表需要執行的class文件
args…表示需要給執行的class文件main方法傳遞的參數,多個參數使用空格分隔。
常用命令選項
-cp:同javac命令的-cp。

jar命令

jar命令用於將編譯好的程序打包成jar文件.
用法:·jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
常用命令選項
-c 創建新檔案
-t 列出檔案目錄
-x 從檔案中提取指定的 (或所有) 文件
-u 更新現有檔案
-v 在標準輸出中生成詳細輸出
-f 指定檔案文件名
-m 包含指定清單文件中的清單信息
-n 創建新檔案後執行 Pack200 規範化
-e 爲捆綁到可執行 jar 文件的獨立應用程序
指定應用程序入口點
-0 僅存儲; 不使用任何 ZIP 壓縮
-P 保留文件名中的前導 ‘/’ (絕對路徑) 和 “…” (父目錄) 組件
-M 不創建條目的清單文件
-i 爲指定的 jar 文件生成索引信息
-C 更改爲指定的目錄幷包含以下文件
-C 更改爲指定的目錄幷包含以下文件
如果任何文件爲目錄, 則對其進行遞歸處理。
清單文件名, 檔案文件名和入口點名稱的指定順序
與 ‘m’, ‘f’ 和 ‘e’ 標記的指定順序相同。

示例 1: 將兩個類文件歸檔到一個名爲 classes.jar 的檔案中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用現有的清單文件 ‘mymanifest’ 並 將 foo/ 目錄中的所有文件歸檔到 ‘classes.jar’ 中:
jar cvfm classes.jar mymanifest -C foo/ .

jar中的mymanifest清單文件

mymanifest是jar的文件清單,每個jar都會有一個META-INF/MANIFEST.MF文件,這個就是文件清單。也可以理解爲描述jar的配置文件,當我們執行一個jar時,JVM怎麼知道依賴的jar去哪裏找,執行類是哪個,這些信息都是通過配置mymanifest來實現的。
MANIFEST.MF文件還可以添加許多其他的信息,感興趣的自行百度。

示例1-編譯執行一個簡單的myProject程序

我們有個myProject程序,App爲程序的啓動類,App類使用slf4j+logbak輸出User對象的信息。下面展示一下如果使用javac和java編譯和運行程序。
程序目錄結果如下圖。其中class-out爲存放編譯後的class文件,libs存放程序依賴的jar。
在這裏插入圖片描述
第一步:切換到myProject目錄下。
在這裏插入圖片描述
第二步:使用javac編譯項目

javac -cp ./libs/slf4j-api-1.7.25.jar;./libs/logback-core-1.2.3.jar;./libs/logback-classic-1.2.3.jar -d ./class-out -encoding utf8 ./src/com/zhangxy/*.java ./src/com/zhangxy/bean/*.java ./src/com/zhangxy/tool/*.java

其中-cp指定程序依賴的jar,-d指定class文件的存放目錄,-encoding指定java文件編碼,最後指定需要編譯的那些目錄下的那些java類。主要資源文件如logback.xml在編譯完之後需要手工copy到編譯目錄。編譯目錄結果:
在這裏插入圖片描述
第三步:使用java執行App

java -cp ./class-out;-cp;./libs/slf4j-api-1.7.25.jar;./libs/logback-core-1.2.3.jar;./libs/logback-classic-1.2.3.jar com.zhangxy.App argA argB

其中-cp指定程序依賴的jar,注意/class-out也需要添加到-cp中,因爲執行App需要。App需要指定完全限定名稱(包名+類名), argA argB是給App的man方法傳遞的參數。
運行結果如下:
在這裏插入圖片描述

示例1-myProject打包爲jar

第一步編寫MAINFEST.FM

Manifest-Version: 1.0
Class-Path: class-out libs/slf4j-api-1.7.25.jar libs/logback-core-1.2.3.jar libs/logback-classic-1.2.3.jar
Main-Class: com.zhangxy.App

這裏需要注意:1,每個冒號後面都需要有個空格。2,最後要留一個空行。
第二步:打包jar

jar cvfm myPrject.jar ./manifest/MANIFEST.MF -C ./class-out/ .

不明白最後的點(.)是什麼意思,不加上就報語法錯誤。
整個過程的運行結果如下圖。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章