确认Spring Boot项目的jar结构
在Spring Boot框架下,使用Maven作为构建工具,假设使用mvn install命令创建了一个jar文件。
这个罐子是怎么组成的?
我将jar文件的扩展名改成zip,然后解压缩并进行了确认,因为jar文件在内部实际上是zip格式。
jar(zip)のルートディレクトリ
├─BOOT-INF
│ ├─classes
│ │ ├─com
│ │ │ └─example
│ │ │ └─[artifactId]
│ │ │ ├─controller
│ │ │ ├─dto
│ │ │ ├─mapper
│ │ │ ├─model
│ │ │ └─service
│ │ ├─static
│ │ └─templates
│ └─lib
├─META-INF
│ └─maven
│ └─com.example
│ └─[artifactId]
└─org
└─springframework
└─boot
└─loader
├─archive
├─data
├─jar
├─jarmode
└─util
所以,使用Spring Boot自己编写的程序将存储在BOOT-INF\classes目录下。
如果不使用Spring Boot的Maven项目的情况下
如果不使用Spring Boot,而是使用纯Java的Maven项目,那么结构会变得简单如下。
jar(zip)のルートディレクトリ
├─com
│ └─example
│ ├─dto
│ └─enums
└─META-INF
└─maven
└─com.example
└─demo
可以通过向他的Maven项目的pom.xml文件添加依赖关系,
以import com.example.enums.Foo的形式进行引用。
关于MANIFEST.MF的内容
在META-INF目录下存在一个名为MANIFEST.MF的文件。
这是一个被称为清单文件的文本文件,里面记录了有关jar文件的描述信息,并在创建jar文件时自动生成。
它包含了在运行时调用main()方法的类和定义类路径的信息。
以下是其中一个例子。
SpringBoot项目的一个例子
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Implementation-Title: springTest
Implementation-Version: 0.0.1-SNAPSHOT
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.springTest.SpringTestApplication
Spring-Boot-Version: 3.0.5
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
如果不使用Spring Boot的情况下,Maven项目的一个示例
Manifest-Version: 1.0
Created-By: Apache Maven 3.8.7
Built-By: circu
Build-Jdk: 17.0.5
当manifest文件损坏或错误时,在启动jar文件时可能会出现”应用名.jar缺少主清单属性”的错误。有关详细信息,请参考解决Spring Boot jar缺少主清单属性的方法。