当前位置: 首页 > news >正文

『Java』把Java项目打成Jar包,并引用项目外的Jar依赖

最近在学习 JavaJavaJava 项目 - 需要将项目打成 JarJarJar 文件,该项目代码内引用了一些 JarJarJar 依赖,记录一下以防后面忘记方法

Env:Java11Env: Java 11Env:Java11
Tools:PowerShellTools: PowerShellTools:PowerShell (没有也可)

项目结构

在这里插入图片描述

  • Main Class: DataInput.java
  • lib: 存放Jar依赖的文件夹

新建MANIFEST.MF 文件

这是一个专为Jar而设的文件,用于存放Jar包的 MetedataMetedataMetedata(如class pathclass \space pathclass path, main classmain \space classmain class…)

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Class-Path:./lib/apache-client-2.16.41.jar ./lib/auth-2.16.41.jar 
Main-Class: com.xxxx.xxxx.batch.DataInput.DataInput
  • 第一行:ManifestManifestManifest 的版本号,默认为1.0
  • 第二行:AntAntAnt 的版本号,需要根据自己的环境更改
  • 第三行以及后面几行:依赖的相对路径(相对于你创建出来的Jar包)
  • 倒数第二行:运行项目代码的 JavaJavaJava 文件
  • 最后一行:我的环境可能因为比较旧,必须有且只有一行空行,否则会报错 -> 找不到 MainClassMain ClassMainClass

打包命令

# 1. Navigate to project folder 
#进入项目文件夹
cd "C:\Users\xxxx\Compile\data-input"# 2. Compile all Java source file 
# 将所有项目代码打成 class 文件# 2.1 Concat all jar file which is used with in the project # 拼接所有 Jar 依赖路径,在Power Shell才能运行
$libJars = (Get-ChildItem -Path .\lib\*.jar | ForEach-Object { $_.FullName }) -join ';'# 其实就是用 ; 拼接上所有依赖的路径,$libJars的值是:C:\Users\xxxx\Compile\data-input\lib\apache-client-2.16.41.jar;C:\Users\xxxx\Compile\data-input\lib\auth-2.16.41.jar;# 2.2 - This compiles all `.java` files under src and puts `.class` files in the `out` directory. The `-cp` option includes all JARs in lib as dependencies. # 打成 class 文件的同时使用 -cp 参数表明 class path,-d 指定 class 文件的输出文件夹名字
javac -cp "$libJars" -d out (Get-ChildItem -Recurse -Filter *.java .\src | ForEach-Object { $_.FullName })# 3. Compile Jar file as per the MANIFEST.MF, list all dependencies and main class inside that file 
# 根据 MANIFEST.MF 文件生成 Jar 包, -C指定项目代码生成的 class 文件,DataInput.jar是打出来的 Jar 文件名
jar cfm DataInput.jar .\MANIFEST.MF -C out .

尝试运行 Jar 文件

# 4. Run the jar file to see if there's error 
# 跑一下 Jar 文件,若打包不成功可以看到Error
java -jar DataInput.jar

成功就能看见项目正常运行的 logloglog (如果有

失败截图如下
在这里插入图片描述

http://www.dtcms.com/a/361710.html

相关文章:

  • Spring Boot 常用注解有哪些?
  • 【MySQL】进阶技术详解
  • 机器学习-时序预测2
  • uniapp使用uview UI,自定义级联选择组件
  • 正则表达式与grep文本过滤详解
  • 盲盒抽谷机小程序开发:如何用3D技术重构沉浸式体验?
  • 【Proteus仿真】8*8LED点阵控制系列仿真——循环显示数字/按键控制显示图案
  • 虚拟机- + linux
  • UFUNCTION C++ 的再次理解
  • 凸集与优化
  • Python OpenCV图像处理与深度学习:Python OpenCV视频处理入门
  • C++实时视频抽帧抓图功能(附源码)
  • DeepSeek-V3.1 模型 API 新特性拆解:逆向 + 火山双渠道适配与推理模式智能切换指南
  • 基于FPGA的红外与可见光图像融合算法
  • Day42 Grad-CAM与Hook函数
  • 进程与线程 - 并发的基石
  • SQL执行过程及原理详解
  • [SWPUCTF 2018]SimplePHP
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享2
  • 刘洋洋《一笔相思绘红妆》上线,献给当代痴心人的一封情书
  • 互斥量(Mutex,全称 Mutual Exclusion)用于保证同一时间只有一个线程(或进程)访问共享资源,从而避免并发操作导致的数据不一致问题
  • RAG-文本到SQL
  • SOME/IP-SD中IPv4端点选项与IPv4 SD端点选项
  • 突破超强回归模型,高斯过程回归!
  • 使用 BayesFlow 神经网络简化贝叶斯推断的案例分享(二)
  • 无重复字符的最长子串,leetCode热题100,C++实现
  • 【FireCrawl】:本地部署AI爬虫+DIFY集成+V2新特性
  • FFmpeg 不同编码的压缩命令详解
  • 速卖通自养号测评系统开发指南:环境隔离与行为模拟实战
  • 测试-用例篇