一.开发一个演示项目

项目源代码开发

  • 项目名称叫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包看看效果

JAR-使用JAVA命令编译打包一个可执行jar包的更多相关文章

  1. java普通项目打包成可执行jar文件时如何添加第三包

    在java的web项目中,引用第三方包的时候非常简单.因为在web项目上中,默认有一个web-inf文件夹.web-inf文件夹下有一个lib文件夹,如果有用到第三方包,直接丢进去就行了.但是对于普通 ...

  2. Java - 在控制台中执行一个可执行jar

    1.Maven打包一个可执行jar: <build> <plugins> <plugin> <groupId>org.apache.maven.plug ...

  3. java ant 编译打包build.xml完整配置范例

    java ant 编译打包build.xml完整配置范例 <?xml version="1.0" encoding="UTF-8" ?> <p ...

  4. Spring Boot 怎么打一个可执行 Jar 包?

    传统的 Java 应用程序都需要打一个 war 包,并到到 Tomcat webapps 目录下运行. Java 支持打 Jar 包,但没有提供一个标准的方式在一个 Jar 包内再加载嵌入别的 Jar ...

  5. Java中如何查看一个类依赖的包

    Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包?   测试语句:   public static void main(Strin ...

  6. (转载)Eclipse将引用了第三方jar包的Java项目打包成可执行jar的两种方法

    转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MA ...

  7. java命令行执行程序解决依赖外部jar包的问题

    用java命令行直接执行程序,如果这个程序需要引用外部jar包.就不能单纯用java xx来执行 如果你的jar包和程序就在一个目录: 编译 javac -cp D:\yy\yy.jar,D\xx\x ...

  8. MAVEN 编译打包测试 指定本地jar

    转载自:http://penuel.iteye.com/blog/1766102 maven对于互联网开发,进行版本管理有着不可或缺的作用;  而经常开发的程序猿直接联调或者依赖未上线或deploy的 ...

  9. 将Java应用程序打包成可执行的Jar包

    可以将多个class文件打包为jar包,在指定程序入口点情况下,可以用 java –jar jar包名称 的方式调用jar包内主类的main函数. 程序源代码如下: //Math.java publi ...

随机推荐

  1. 怎样安装Arch Linux以及Deepin桌面环境

    一.概述 Arch Linux 是一个轻量级的Linux发行版本,实际上,Arch Linux提供给用户很多选择,用户可以自定义自己的安装过程,不x像其他很多的Linux发行版本,安装过程甚至是一个只 ...

  2. IEEE浮点数标准

    IEEE浮点数标准 阅读笔记:Computer System : A Programmmer's Perspective 基本概念 IEEE浮点数标准采用 \[V=(-1)^s\times M\tim ...

  3. 【2020.12.02提高组模拟】球员(player)

    题目 题目描述 老师们已经知道学生喜欢睡觉,Soaring是这项记录保持者.他只会在吃饭或玩FIFA20时才会醒来.因此,他经常做关于足球的梦,在他最近的一次梦中,他发现自己成了皇家马德里足球俱乐部的 ...

  4. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  5. idea:如果String 跟System该怎么解决

    这个问题还是比较简单的,但有很多小白不知道,我也是刚刚才遇到查了一些资料才知道的 接下来这里就是需要配置你的SDK,所以请你点击右上角的图标,进行配置SDK jdk下载地址:https://www.o ...

  6. CSS聚光灯文字(无图片)

    Welcome to my admin site! h1 { font-size: 70px; color: rgba(255, 255, 255, 1); padding: 0; margin: 0 ...

  7. JavaWeb知识梳理

    目录 JavaWeb Web服务器 技术讲解 Web服务器 Tomcat Http Maven pom.xml Servlet HelloServlet Servlet原理 Mapping Servl ...

  8. nodejs事件和事件循环简介

    目录 简介 事件 事件循环 事件循环的阻塞 事件循环举例 栈和消息队列 作业队列和promise process.nextTick() setImmediate() setInterval() 简介 ...

  9. 第11.9节 Python正则表达式的贪婪模式和非贪婪模式

    在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "*". " ...

  10. 冲刺Day6

    每天举行站立式会议照片: 昨天已完成的工作: 1.确认商品搜索栏页面(全) 2.订单模块的大部分代码 3.用户模块的大部分代码 今天计划完成的工作: 成员 任务 高嘉淳 检查用户模块的功能并更正 覃泽 ...