為什么有這種需求,萬惡的mac上面無法像Win上面爽快的操作jar文件,Win上面可以直接用winRAR刪掉jar里面的文件,不涉及解壓jar的問題。但這種簡單的需求在mac上就很難受,于是就生出了這篇文章。
說一下最近的兩個需要看jar的情況:
1、Ali的utdid的包,這個玩意兒做統計或者集成友盟啥的都有可能遇到,最近做Unity,把Android當做插件給Unity用的時候,有時候Unity的C#插件跟Android的插件混起來就可能會有這個問題。
2、做了一個java的七牛上傳的jar,使用的時候只需要調用一下這個jar就可以調用七牛上傳了。做這個的時候老是提示MF文件不存在,想看看到底打沒打到jar里面的時候就很難受,看不到。
先看下解壓jar的方法
#!/bin/sh
tempDir="qiniuJarCodeDir"
qiniuJar="QiniuUpload.jar"
rm -rf $tempDir
mkdir $tempDir
cp $qiniuJar $tempDir
cd $tempDir
unzipJarCmd="jar -xf $qiniuJar"
$unzipJarCmd
rm -rf $qiniuJar
核心的就是 jar -xf 如果需要打印信息的話就是 jar -xvf
下面是把文件打包成jar的方法
#!/bin/sh
tempDir="qiniuJarCodeDir"
qiniuJar="QiniuUpload.jar"
cd $tempDir
#-c:創建新的存檔 -m:包含來自標明文件的標明信息 -f:指定存檔文件名
zipJarCmd="jar -cmf META-INF/MANIFEST.MF $qiniuJar ./"
$zipJarCmd
java -jar QiniuUpload.jar $1 $2 $3
我們知道如果我們需要使用java -jar執行jar包的話,就需要在MANIFEST.MF中定義Main-Class:main函數所在的全限定類名。該類必須是一個可執行的類,可以俠義理解為存在 main()函數的類
我們看下jar命令的參數
jar命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目錄]文件名...
其中{ctxu}這四個參數必須選選其一。[v f m e 0 M i ]是可選參數,文件名也是必須的。
參數 | 詳細解析 |
---|---|
-c | 創建一個jar包 |
-t | 顯示jar中的內容列表 |
-x | 解壓jar包 |
-u | 添加文件到jar包中 |
-f | 指定jar包的文件名 |
-v | 生成詳細的報造,并輸出至標準設備 |
-m | 指定manifest.mf文件.(manifest.mf文件中可以對jar包及其中的內容作一些一設置) |
-0 | 產生jar包時不對其中的內容進行壓縮處理 |
-M | 不產生所有文件的清單文件(Manifest.mf)。這個參數與忽略掉-m參數的設置 |
-i | 為指定的jar文件創建索引文件 |
-C | 表示轉到相應的目錄下執行jar命令,相當于cd到那個目錄,然后不帶-C執行jar命令 |
當然就像我們上面說的像utdid的問題,如果我們需要刪掉某些文件,就先解壓,然后刪掉某些文件夾再打包起來就可以這樣做。
aliJar="alipaySdk-20170725.jar"
SEC_JAR_PATH="libs/$aliJar"
DEST_ALI_PATH="template/ali/"
mkdir $DEST_ALI_PATH
cp $SEC_JAR_PATH $DEST_ALI_PATH
cd $DEST_ALI_PATH
unzipJarCmd="jar -xvf $aliJar"
$unzipJarCmd
rm -rf "com/ta/"
rm -rf "com/ut/"
rm -rf $aliJar
zipJarCmd="jar -cvf $aliJar ./"
$zipJarCmd
cdCmd="cd ../../"
$cdCmd
當然如果只是需要當做jar包,不需要用作可執行的jar就不需要manifest.mf文件,直接把文件打包成jar就好了