『Java』把Java项目打成Jar包,并引用项目外的Jar依赖
最近在学习 JavaJavaJava 项目 - 需要将项目打成 JarJarJar 文件,该项目代码内引用了一些 JarJarJar 依赖,记录一下以防后面忘记方法
Env:Java11Env: Java 11Env:Java11
Tools:PowerShellTools: PowerShellTools:PowerShell (没有也可)
项目结构
Main Class
: DataInput.javalib
: 存放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 (如果有
失败截图如下