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.java
和DecryptPortal.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
- 进入项目根目录下的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]#
- 进入刚刚新建的
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]#
- 编写
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包的更多相关文章
- java普通项目打包成可执行jar文件时如何添加第三包
在java的web项目中,引用第三方包的时候非常简单.因为在web项目上中,默认有一个web-inf文件夹.web-inf文件夹下有一个lib文件夹,如果有用到第三方包,直接丢进去就行了.但是对于普通 ...
- Java - 在控制台中执行一个可执行jar
1.Maven打包一个可执行jar: <build> <plugins> <plugin> <groupId>org.apache.maven.plug ...
- java ant 编译打包build.xml完整配置范例
java ant 编译打包build.xml完整配置范例 <?xml version="1.0" encoding="UTF-8" ?> <p ...
- Spring Boot 怎么打一个可执行 Jar 包?
传统的 Java 应用程序都需要打一个 war 包,并到到 Tomcat webapps 目录下运行. Java 支持打 Jar 包,但没有提供一个标准的方式在一个 Jar 包内再加载嵌入别的 Jar ...
- Java中如何查看一个类依赖的包
Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包? 测试语句: public static void main(Strin ...
- (转载)Eclipse将引用了第三方jar包的Java项目打包成可执行jar的两种方法
转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MA ...
- java命令行执行程序解决依赖外部jar包的问题
用java命令行直接执行程序,如果这个程序需要引用外部jar包.就不能单纯用java xx来执行 如果你的jar包和程序就在一个目录: 编译 javac -cp D:\yy\yy.jar,D\xx\x ...
- MAVEN 编译打包测试 指定本地jar
转载自:http://penuel.iteye.com/blog/1766102 maven对于互联网开发,进行版本管理有着不可或缺的作用; 而经常开发的程序猿直接联调或者依赖未上线或deploy的 ...
- 将Java应用程序打包成可执行的Jar包
可以将多个class文件打包为jar包,在指定程序入口点情况下,可以用 java –jar jar包名称 的方式调用jar包内主类的main函数. 程序源代码如下: //Math.java publi ...
随机推荐
- django搭建
1.进入终端使用虚拟环境安装---pip install django==2.2 2.创建新的工程django-admin startproject bookpro 3.创建app或模块 使用djan ...
- qsort的cmp函数理解
qsort使用 近期频繁使用qsort函数,但是对于cmp函数却一直不太熟悉,现用现查.故写一篇小笔记记录一下. 函数原型: void qsort(void *base,size_t NumEle,s ...
- 有了Git这个操作,我再也不怕代码混乱了!
大家好,今天的文章我们来介绍git当中一个非常常用的功能--储藏. 大家在协同开发的时候应该都有这样的经历,有的时候我们的功能开发了一半,因为某些原因我们想要checkout到其他的分支上查看代码或者 ...
- 基于gin的golang web开发:认证利器jwt
JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5 ...
- Razorpay支付对接,JAVA对接篇
Razorpay 作为印度本土的一家支付公司,类似中国的支付宝 微信,本篇记录一下对接印度第三方支付公司 准备工作: 注册公司 申请Razorpay账号 申请正式环境 Razorpay工作台: 获取k ...
- PyQt+moviepy音视频剪辑实战1:多个音视频合成顺序播放或同屏播放的视频文件实现详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...
- Python中__new__方法为什么有人说是构造方法?有什么作用?
__new__方法是Python新式类引入的,通常用于控制生成一个新实例的过程.它是类级别的静态方法,是在创建实例对象前执行,如果自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类 ...
- PyQt(Python+Qt)学习随笔:QTableWidget表格部件中行高和列宽的计算方式
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中行高和列宽的计算在Qt提供的资料中内容介绍比较泛,细节说得不清楚, ...
- 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍
在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...
- PyQt(Python+Qt)学习随笔:Designer中属性设置界面的属性字体使用粗黑体的含义
老猿Python博文目录 老猿Python博客地址 使用了好几个月的Designer,今天才发现属性编辑界面的属性名有的为粗而黑,有的则不是,如图: 稍微测试了一下,发现是对属性值进行过调整,不再是缺 ...