JAR-使用JAVA命令編譯打包一個可執行jar包


一.開發一個演示項目

項目源代碼開發

  • 項目名稱叫jar-package-example(其實只是一個文件夾, 用以將演示的所有文件夾和文件存放在其中, 沒啥其它作用), 為了方便, 后文統一叫jar-package-example目錄為項目根目錄.

  • 項目下有三個子文件夾:

    • lib: 存放依賴包
    • src: 存放源碼文件
    • target: 存放編譯后的class文件以及作為打包的目標文件夾
    [root@xs jar-package-example]# ls -t
    target  src  lib
    [root@xs jar-package-example]# pwd
    /root/jar-package-example
    [root@xs jar-package-example]#
    

創建包結構

在src源碼文件夾下創建包結構:

====> com.sfg.xs

=====> portal

=====> utils

[root@xs jar-package-example]# ls -t
target  src  lib
[root@xs jar-package-example]# pwd
/root/jar-package-example
[root@xs jar-package-example]# mkdir -p src/com/sfg/xs/portal
[root@xs jar-package-example]# mkdir -p src/com/sfg/xs/utils
[root@xs jar-package-example]# cd src/com/sfg/xs
[root@xs xs]# ls -t
utils  portal
[root@xs xs]# pwd
/root/jar-package-example/src/com/sfg/xs
[root@xs xs]#

至此, 演示所用的包結構已創建完成.

將依賴包放入項目根路徑的lib目錄下

編寫代碼文件

com.sfg.xs.utils包下放入一個工具類CipherUtil.java, 工具類代碼如下:

package com.sfg.xs.utils;

import com.alibaba.druid.filter.config.ConfigTools;

/**
 * @Author:周建林
 * @Time:2020/12/25 14:56
 * @Description
 */
public class CipherUtil {
    public static String encrypt(String password) throws Exception {
        return ConfigTools.encrypt(password);
    }

    public static String decrypt(String password) throws Exception {
        return ConfigTools.decrypt(password);
    }
}

放入工具類之后如圖:

com.sfg.xs.portal包下放入兩個入口類EncryptPortal.javaDecryptPortal.java, 兩個入口類類代碼如下:

package com.sfg.xs.portal;

import com.sfg.xs.utils.CipherUtil;
import org.apache.commons.lang3.StringUtils;

/**
 * @Author:周建林
 * @Time:2020/12/25 15:02
 * @Description
 */
public class EncryptPortal {
    public static void main(String[] args) throws Exception {
        if(args == null || args.length == 0) {
            System.err.println("請輸入密碼!");
            System.exit(1);
        }
        String password = args[0];
        if(StringUtils.isBlank(password)) {
            System.out.println(password);
        }else{
            System.out.println(CipherUtil.encrypt(password));
        }
        System.exit(0);
    }
}

package com.sfg.xs.portal;

import com.sfg.xs.utils.CipherUtil;
import org.apache.commons.lang3.StringUtils;

/**
 * @Author:周建林
 * @Time:2020/12/25 15:26
 * @Description
 */
public class DecryptPortal {
    public static void main(String[] args) throws Exception {
        if(args == null || args.length == 0) {
            System.err.println("請輸入密碼!");
            System.exit(1);
        }
        String password = args[0];
        if(StringUtils.isBlank(password)) {
            System.out.println(password);
        }else{
            System.out.println(CipherUtil.decrypt(password));
        }
        System.exit(0);
    }
}

放入入口類之后如圖:

至此, 演示所用的源代碼已經准備完成. 下面開始編譯項目.

二.編譯與打包項目

編譯代碼

進入項目根目錄, 執行編譯命令

[root@xs jar-package-example]# ls -lrt
total 12
drwxr-xr-x 2 root root 4096 Dec 28 15:01 lib
drwxr-xr-x 3 root root 4096 Dec 28 15:05 src
drwxr-xr-x 2 root root 4096 Dec 28 16:03 target
[root@xs jar-package-example]# javac -d target -extdirs lib -encoding utf-8 src/com/sfg/xs/portal/*.java src/com/sfg/xs/utils/*.java
# 此命令在jdk14版本執行失敗了, 換jdk8成功, 其它版本未驗證. jdk14版本下使用報錯不允許-extdirs參數, 不知道是我使用方法不對還是其它原因
[root@xs jar-package-example]#

編譯之后, 即在項目根目錄的target目錄下生成了class文件

[root@xs jar-package-example]# cd target/
[root@xs target]# ls -lrt
total 4
drwxr-xr-x 3 root root 4096 Dec 28 16:03 com
[root@xs target]# ls -rlt com/
total 4
drwxr-xr-x 3 root root 4096 Dec 28 16:03 sfg
[root@xs target]# ls -rlt com/sfg/xs
total 8
drwxr-xr-x 2 root root 4096 Dec 28 16:03 portal
drwxr-xr-x 2 root root 4096 Dec 28 16:03 utils
[root@xs target]# ls -rlt com/sfg/xs/portal/
total 8
-rw-r--r-- 1 root root 859 Dec 28 16:03 DecryptPortal.class
-rw-r--r-- 1 root root 859 Dec 28 16:03 EncryptPortal.class
[root@xs target]# ls -rlt com/sfg/xs/utils/
total 4
-rw-r--r-- 1 root root 485 Dec 28 16:03 CipherUtil.class
[root@xs target]#

編譯命令參數解釋說明: javac -d target -extdirs lib -encoding utf-8 src/com/sfg/xs/portal/*.java src/com/sfg/xs/utils/*.java

注意, 所有的說明都基於在項目根目錄的情況下.

  • -d target: 指定將編譯后的二進制文件輸出到當前目錄的target目錄下
  • -extdirs lib: 指定項目使用到的擴展依賴包所在的目錄
  • -encoding utf-8: 使用utf-8字符集進行編碼
  • 最后的參數為編譯的源文件路徑, 支持星號作通配符, 多個源文件使用空格隔開. 編譯時, 會根據類文件中的package頭生成包路徑

至此, 源代碼與代碼編譯都已完成. 后面可以進行打jar包了.

項目打jar包

依賴包處理

本次演示將依賴包一並打入jar包中使用, 因此先將依賴包及其整個所在目錄都復制到target目錄下.

[root@xs target]# pwd
/root/jar-package-example/target
[root@xs target]# cp -r ../lib ./
[root@xs target]# ls -lrt
total 8
drwxr-xr-x 3 root root 4096 Dec 28 16:03 com
drwxr-xr-x 2 root root 4096 Dec 28 16:06 lib
[root@xs target]#

編寫MANIFETS.MF文件

如果需要打出來的jar包可以直接使用java -jar命令執行的話, 則需要MANIFEST.MF文件, 並且需要指出默認的執行入口類.其文件格式為"key: value"形式, 冒號后面必須有空格, 文件末尾必須以換行符結尾.

另附上一份兒MANIFEST.MF文件說明鏈接: https://docs.oracle.com/en/java/javase/15/docs/specs/jar/jar.html#jar-manifest

  1. 進入項目根目錄下的target目錄下, 創建META-INF文件夾
[root@xs target]# pwd
/root/jar-package-example/target
[root@xs target]# ls -lrt
total 8
drwxr-xr-x 3 root root 4096 Dec 28 16:03 com
drwxr-xr-x 2 root root 4096 Dec 28 16:06 lib
[root@xs target]# mkdir META-INF
[root@xs target]# ls -lrt
total 12
drwxr-xr-x 3 root root 4096 Dec 28 16:03 com
drwxr-xr-x 2 root root 4096 Dec 28 16:06 lib
drwxr-xr-x 2 root root 4096 Dec 28 16:07 META-INF
[root@xs target]#
  1. 進入剛剛新建的META-INF目錄, 創建MANIFEST.MF文件
[root@xs META-INF]# pwd
/root/jar-package-example/target/META-INF
[root@xs META-INF]# ls -lrt
total 0
[root@xs META-INF]# touch MANIFEST.MF
[root@xs META-INF]# ls -lrt
total 0
-rw-r--r-- 1 root root 0 Dec 28 16:08 MANIFEST.MF
[root@xs META-INF]#
  1. 編寫MANIFEST.MF文件內容
Manifest-Version: 1.0	# 表明文件版本
Class-Path: . ./lib/commons-lang3-3.8.1.jar ./lib/druid-1.1.10.jar	# 指定依賴包路徑
Main-Class: com.sfg.xs.portal.EncryptPortal	# 指定默認的執行入口類
# 最后必須以換行符結尾

執行命令打包

進入target目錄下, 執行打包命令: jar -cfM jar-package-example.jar *, 命令中, jar包名隨自己取.

[root@xs target]# pwd
/root/jar-package-example/target
[root@xs target]# ls -lrt
total 12
drwxr-xr-x 3 root root 4096 Dec 28 16:03 com
drwxr-xr-x 2 root root 4096 Dec 28 16:06 lib
drwxr-xr-x 2 root root 4096 Dec 28 16:16 META-INF
[root@xs target]# jar -cfM jar-package-example.jar *
[root@xs target]# ls -lrt
total 2956
drwxr-xr-x 3 root root    4096 Dec 28 16:03 com
drwxr-xr-x 2 root root    4096 Dec 28 16:06 lib
drwxr-xr-x 2 root root    4096 Dec 28 16:16 META-INF
-rw-r--r-- 1 root root 3011900 Dec 28 16:18 jar-package-example.jar
[root@xs target]#

三.運行jar包看看效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM