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.fig.ConfigTools;
/**
* @Author:周建林
* @Time:2020/12/25 14:56
* @Description
*/
public class CipherUtil {
public static String encrypt(String password) throws Exception {
pt(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.apachemons.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) {
}
String password = args[0];
if(StringUtils.isBlank(password)) {
System.out.println(password);
}else{
System.out.pt(password));
}
}
}
package com.sfg.xs.portal;
import com.sfg.xs.utils.CipherUtil;
import org.apachemons.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) {
}
String password = args[0];
if(StringUtils.isBlank(password)) {
System.out.println(password);
}else{
System.out.println(CipherUtil.decrypt(password));
}
}
}
放⼊⼊⼝类之后如图:
⾄此, 演⽰所⽤的源代码已经准备完成. 下⾯开始编译项⽬.
⼆.编译与打包项⽬
编译代码
进⼊项⽬根⽬录, 执⾏编译命令
[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
cipher命令[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"形式, 冒号后⾯必须有空格, ⽂件末尾必须以换⾏符结尾.
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]#
2. 进⼊刚刚新建的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]#
3. 编写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包看看效果
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论