java命令打包java工程

这篇博客介绍了如何通过java命令行自动化打包java工程,包括使用javac编译java文件,解决依赖库问题,以及如何用jar命令将class文件和其他jar包合并成单一jar。适合在服务器或无IDE环境下打包java工程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动打包java工程

介绍

自动打包java工程,主要功能是什么呢?没错,如标题所言,就是通过命令实现自动打包普通java工程,将java工程打包成一个jar包。

前言

肯定很多人会疑惑,为什么不用IDE直接导出jar呢?还要编写命令?不是多此一举?
答案是:
特殊情况需要,如果需要在服务器中,实现自动生成jar包,而不是在IDE的情况下,就需要该工具实现导出jar包。当然,本地也是可以使用的。
如果,刚好你也有这种需求,需要通过java命令导出jar包的话,可以看下这篇博客。因为,我就是刚好碰到。
因为,我找不到完整的命令,所以,想把这次的调研和开发脚本过程记录下来~
当然,该工具还需要更加完善,如有建议,欢迎留言~

思路

  1. 通过javac命令,实现将java格式的文件编译成class文件
  2. 将所有的class文件和配置文件,通过jar命令压缩成功一个jar文件

需要解决的问题

  1. 如果使用命令javac编译所有java文件?
  2. 使用javac编译java文件的过程中,如何让编译的java文件能正确地找到对应依赖的lib和其他包名下的java文件?
  3. 如何在压缩class成jar的时候,将其他jar包也压缩到目标jar中呢?

方案如下

–>如何编译所有java文件?

两种情况
一、如果要导出的jar包是有执行主类的,先是查找项目配置文件 MANIFEST.MF 读取出执行的Main类,然后编译Main类,因为Main类在编译的过程中,会通过需要用到的类去寻找编译,这样的话,就可以链式的编译整个项目有需要用到的java文件。
二、导出来的jar包不可以直接执行的,只能作为lib使用的,也就是没有配置文件,那就是通过找出所有包名,然后编译所有包名下的java文件,当然,javac可以一次性编译一个文件夹下的所有java文件。

–>使用javac编译java文件的过程中,如何让编译的java文件能正确地找到对应依赖的lib和其他包名下的java文件?

javac命令中,有一个可选项,-cp(-classpath) 后面带的就是编译时需要用到的依赖jar 和对应的其他依赖库,还有所有包名,但是为了编译的时候能找到对应的包名,必须cd到对应的src目录
例如:

javac -classpath .;../libs/dom4j-2.1.0.jar;compiler;main;utils;vo -encoding utf-8 -d ../classesOutput -Xlint:unchecked -Xlint:deprecation builder/*.java
–>如何在压缩class成jar的时候,将其他jar包也压缩到目标jar中呢?

将用到的jar包复制到编译出的class文件夹中,然后使用jar命令压缩即可

javac命令

javac -classpath .;../libs/dom4j-2.1.0.jar;compiler;main;utils;vo -encoding utf-8 -d ../classesOutput -Xlint:unchecked -Xlint:deprecation builder/*.java
说明:
-classpath 后面带的是编译过程中所需要用到的类,可以为jar包、类保存的文件夹、zip文件等
-encoding 指定编译时的java文件编码格式为utf-8格式
-d 后面带输出的class的路径
-Xlint:unchecked -Xlint:deprecation 避免编译不通过
builder/*.java 编译当前目录下的builder包中的所有Java文件

注意:
1、Windows下和Linux下的命令还有所差异,Windows下,-cp(-classpath)后面接的库需要用’;‘隔开,Linux下的得用’:'隔开
2、在Linux下,使用Java.Runtime.exec命令执行的时候,需要注意,部分命令执行无法达到效果,也就是没执行起来,具体的调用,在Linux下,需要加上两个操作符。
String[] cmds = {“sh”, “-c”, cmd};
process = Runtime.getRuntime().exec(cmds, null, runDir);

3、文件的编码格式最好是utf-8,不然编译会出问题
4、jar包和输出路径可以使用绝对路径,但是包名的应用不能使用绝对路径,不然会找不到对应的包名
5、执行该命令的时候,一定要cd到src目录中,不然包名会找不到!
6、最好添加这两个可选项 -Xlint:unchecked -Xlint:deprecation 不然,当接口废弃或者unchecked的时候,会提示哪些方法是unchecked和deprecation的!

jar命令

jar cvfm C:/Users/37/Desktop/test/test.jar C:/Users/37/Desktop/test/bin/META-INF/MANIFEST.MF -C C:/Users/37/Desktop/test/bin/ .
说明:
jar cvfm 输出的jar包的路径 配置文件的路径 -C 编译的好的class文件夹路径 .
注意:bin/ 表示class的父级文件夹;最后记得要空格加一个"."

写在最后

具体的工具代码实现,最主要的命令就是上面这两个,如果遇到什么问题,欢迎留言~
项目的GitHub地址:ExportJarCommand
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值