SpringBoot项目可以直接打成jar包,发布到服务器上,通过java -jar命令执行,发布运行一个服务端的项目非常方便。
那SpringBoot的jar包是如何运行起来的呢?先手动做一个可执行的jar包吧
目录结构
程序代码
package com.compile.demo.bean;
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
package com.compile.demo;
import com.compile.demo.bean.Student;
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
String str = "Hello ";
Student s = new Student("zhangsan");
if (StringUtils.isNotEmpty(str)) {
System.out.println(str + s.getName());
} else {
System.out.println("为空!");
}
}
}
手动编译
- 执行:
javac -encoding utf-8 -Djava.ext.dirs=libs -d classes src\com\compile\demo\*.java src\com\compile\demo\bean\*.java
- 当前目录结构:
手动编译的详细过程请参照:手动编译及执行java类(包含并引用第三方jar)
打jar包
- 创建MANIFEST.MF文件
Manifest-Version: 1.0
Main-Class: com.compile.demo.Main
Class-Path: commons-lang3-3.4.jar
请务必在文件的最后一行,至少加一个回车换行
- Manifest-Version 版本号默认为1.0
- Main-Class 入口的主类,也就是main方法所在的类
- Class-Path 引用外部类的路径
-
再将手动编译的.class文件和引用的commons-lang3-3.4.jar移动到与MANIFEST.MF同一个目录下
- 打包
在该文件夹下执行:jar -cvfm compile.jar MANIFEST.MF com commons-lang3-3.4.jar
- jar命令是jdk自带的,可在%JAVA_HOME%\bin中找到
- c 创建新档案
- v 在标准输出中生成详细输出,有输出信息
- f 指定档案文件名
- m 包含指定清单文件中的清单信息,也就是指定我们的MANIFEST.MF 如果没有这个参数,会生成一个默认的MANIFEST.MF文件
- compile.jar 指定生成jar包的名称
-
MANIFEST.MF com commons-lang3-3.4.jar 要打包的文件
成功之后会在当前文件夹下生成一个compile.jar
- 运行
执行:java -jar compile.jar
输出结果:Hello zhangsan
jar包结构
可借助IntelliJ IDEA来查看,图形化的结构看起来更清晰
根目录下是
- com 就是我们的.class文件
- commons-lang3-3.4.jar 依赖的外部jar包
-
META-INF 放着MANIFEST.MF,这个文件不可少,文件的内容也不能随意改动
可以看出,文件内容与我们打包之前的基本没有变化,只是多了一个Created-By
执行java -jar命令时,就是根据Main-Class找到程序的入口,通过Class-Path找到依赖的外部jar包