解壓JAR到指定目錄
一、概述
通常,當我們在 Java 項目中需要 JAR 文件時,我們會將它們作為外部庫放在類路徑中,而不會提取它們。但是,我們有時希望將它們添加到我們的文件系統中。
在本教程中,我們將探討如何在命令行中將 JAR 文件提取到指定目錄。我們將使用 Linux 和 Bash 作為示例來介紹每種方法。
二、問題介紹
在本教程中,我們將使用 Guava 的JAR 文件作為示例。撰寫本文時的最新版本是 guava 31.1-jre.jar
。
Java 提供了jar
命令來創建、更新、查看和提取 JAR 文件。接下來,讓我們使用jar
命令提取 Guava 的 JAR 文件:
$ tree /tmp/test/jarTest
/tmp/test/jarTest
└── guava-31.1-jre.jar
0 directories, 1 file
$ pwd
/tmp/test/jarTest
$ jar xf guava-31.1-jre.jar
$ tree /tmp/test/jarTest
/tmp/test/jarTest
├── com
│ └── google
│ ├── common
│ │ ├── annotations
│ │ │ ├── Beta.class
...
27 directories, 2027 files
如上面的輸出所示,我們可以使用jar xf
提取一個 JAR 文件, jar
命令默認將其提取到當前目錄。
但是**jar
**命令不支持解壓文件到指定目錄。
接下來,讓我們看看如何在行動中實現這一點。
3、解壓前進入目標目錄
我們已經了解到jar
命令默認將給定的 JAR 文件提取到當前工作目錄。
於是,一個解決問題的思路就產生了:如果我們要將JAR文件解壓到指定目標,可以先進入目標目錄,然後啟動jar
命令。
接下來,讓我們確定這個想法是否按預期工作。
3.1.測試想法
首先,讓我們創建一個新目錄/tmp/test/newTarget
:
$ mkdir /tmp/test/newTarget
$ tree /tmp/test/newTarget
/tmp/test/newTarget
0 directories, 0 files
接下來我們進入目標目錄,然後解壓Guava的JAR文件:
$ cd /tmp/test/newTarget && jar xf /tmp/test/jarTest/guava-31.1-jre.jar
$ tree /tmp/test/newTarget
/tmp/test/newTarget
├── com
│ └── google
│ ├── common
│ │ ├── annotations
│ │ │ ├── Beta.class
...
如上例所示,這個想法可行。我們已經將 Guava 的 JAR 文件提取到我們想要的目錄中。
然而,如果我們重新審視我們執行過的命令,我們會發現有一些不便之處:
- 如果是新目錄,我們必須首先手動創建目標目錄。
- 當
cd
命令更改我們當前的工作目錄時,我們必須傳遞 JAR 文件及其絕對路徑。 - 執行命令後,我們留在目標目錄中,而不是我們開始的地方。
那麼接下來,讓我們看看如何改進我們的解決方案。
3.2.創建xJarTo()
函數
我們可以創建一個 shell 函數來自動創建目錄並調整 JAR 文件的路徑。讓我們先看看這個函數,然後了解它是如何工作的:
#!/bin/bash
xJarTo() {
the_pwd="$(pwd)"
the_jar="$1"
the_dir="$2"
if [[ "$the_jar" =~ ^[^/].* ]]; then
the_jar="${the_pwd}/$the_jar"
fi
echo "Extracting $the_jar to $the_dir ..."
mkdir -p "$the_dir"
cd "$the_dir" && jar xf "$the_jar"
cd "$the_pwd"
}
該函數首先將用戶的當前工作目錄 ( pwd
) 存儲在the_pwd
變量中。
然後,它檢查 JAR 文件的路徑:
- 如果以“
/
”開頭——絕對路徑,所以我們直接使用用戶輸入 - 否則——相對路徑。我們需要在用戶的當前工作目錄前添加以構建要使用的絕對路徑
因此,該函數同時適應絕對和相對 JAR 路徑。
接下來,我們在進入目標目錄之前執行mkdir -p
命令。 -p
選項告訴mkdir
命令在給定路徑中創建缺少的目錄(如果有的話)。
然後,我們使用cd
進入目標目錄,使用準備好的JAR文件路徑執行jar
xf
命令。
最後,我們導航回用戶的當前工作目錄。
3.3.測試功能
現在我們了解了xJarTo()
函數的工作原理,讓我們獲取該函數的source
並測試它是否按預期工作。
首先我們測試目標目錄是新建的,JAR文件是絕對路徑的場景:
$ pwd
/tmp/test
$ xJarTo /tmp/test/jarTest/guava-31.1-jre.jar /tmp/a_new_dir
Extracting /tmp/test/jarTest/guava-31.1-jre.jar to /tmp/a_new_dir ...
$ tree /tmp/a_new_dir
/tmp/a_new_dir
├── com
│ └── google
│ ├── common
│ │ ├── annotations
│ │ │ ├── Beta.class
...
$ pwd
/tmp/test
如上面的輸出所示,該函數按預期工作。新目錄是即時創建的,提取的內容位於/tmp/a_new_dir
下。此外,我們在調用該函數後仍在/tmp/test
下。
接下來我們測試一下相對JAR路徑的場景:
$ pwd
/tmp/test/jarTest
$ xJarTo guava-31.1-jre.jar /tmp/another_new_dir
Extracting /tmp/test/jarTest/guava-31.1-jre.jar to /tmp/another_new_dir ...
$ tree /tmp/another_new_dir
/tmp/another_new_dir
├── com
│ └── google
│ ├── common
│ │ ├── annotations
│ │ │ ├── Beta.class
...
$ pwd
/tmp/test/jarTest
這一次,因為我們在/tmp/test/jarTest
,我們將guava-31.1-jre.jar
直接傳遞給函數。事實證明,該功能也能完成這項工作。
4.使用其他解壓命令
JAR 文件使用 ZIP 壓縮。所以所有的解壓工具都可以解壓JAR文件。如果解壓縮實用程序支持解壓縮到指定目錄,則可以解決問題。
這種方法需要我們系統上至少有一個可用的解壓縮工具。否則,我們需要安裝它。值得一提的是,在系統上安裝軟件包通常需要root
或sudo
權限。
那麼接下來,我們就以unzip
為例,展示一下流行的yum
和apt
包管理器的安裝命令:
# apt
sudo apt install unzip
# yum
sudo yum install unzip
unzip
命令支持-d
選項以將 ZIP 存檔解壓縮到不同的目錄:
$ unzip guava-31.1-jre.jar -d /tmp/unzip_new_dir
$ tree /tmp/unzip_new_dir
/tmp/unzip_new_dir
├── com
│ └── google
│ ├── common
│ │ ├── annotations
│ │ │ ├── Beta.class
...
正如我們所見, unzip -d
將 JAR 文件解壓縮到指定目錄。
5.結論
在本文中,我們了解了將 JAR 文件提取到指定目錄的兩種方法。
為此,我們可以創建一個 shell 函數來包裝標準 JAR 命令。或者,如果我們在系統上有其他可用的解壓縮工具,例如unzip
,我們可以使用它們相應的選項將 JAR 內容解壓縮到所需目錄。