最近在学习 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 (如果有

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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐