在 Maven 项目中打包生成的 JAR 文件是一个压缩包,包含编译后的 Java 类文件及相关的资源文件。通常 JAR 包的内容和结构大致如下:
1. META-INF 文件夹
-
目录位置:
META-INF/
-
内容:
MANIFEST.MF
文件:这个文件包含 JAR 包的元数据,如版本信息、依赖项、主类等。Maven 打包时会自动生成该文件。
示例
MANIFEST.MF
文件内容:Manifest-Version: 1.0 Created-By: Apache Maven 3.8.4 Build-Jdk: 11.0.12 Main-Class: com.example.MainClass (如果指定了主类)
该文件描述了 JAR 包的基本信息,如果在
pom.xml
中指定了mainClass
,它也会在这个文件中标注主类,以便支持java -jar
运行。 -
其他可能出现的文件:
maven/
:如果你启用了 Maven 构建相关的配置,可能会包含pom.properties
和pom.xml
文件,记录项目的 Maven 构建信息。- 签名文件:如果你对 JAR 文件进行了签名,签名文件和证书也会存放在这个目录下。
2. 项目的编译类文件
- 目录位置: 根目录下,通常按包名划分成多个文件夹,如
com/example/...
。 - 内容: 项目中编译生成的
.class
文件(即源代码编译后的字节码文件)。
示例目录结构:
com/
example/
MainClass.class
MyService.class
这些文件是 Maven 在打包过程中将 src/main/java/
下的 Java 源代码编译后放入 JAR 包的。
3. 资源文件
- 目录位置: 按照项目的包结构或文件夹结构保留在根目录下。
- 内容: 项目中定义的静态资源文件,如
src/main/resources/
下的所有文件都会打包进 JAR 文件。这些文件可能包括:application.properties
、application.yml
(Spring Boot 项目中的配置文件)。- 其他资源文件,如 XML 配置文件、图片、HTML、CSS、国际化文件等。
示例目录结构:
resources/
application.properties
messages.properties
4. 依赖的第三方库(可选)
如果你使用 Maven shade
插件或 spring-boot-maven-plugin
等工具将所有依赖打包成一个可执行 JAR(fat JAR 或 uber JAR),则会将所有的依赖项一起打包到 JAR 文件中。依赖的库通常会放置在 JAR 文件的 BOOT-INF/lib/
或者 lib/
目录下(根据插件不同,位置也不同)。
示例目录结构:
BOOT-INF/
lib/
spring-core-5.3.10.jar
jackson-databind-2.12.3.jar
5. 自定义目录/文件(可选)
- 目录位置: 项目中自定义的目录结构和文件。
- 内容: 如果项目中有其他特殊的文件或配置,如日志文件、特定应用的配置文件,它们也会按照项目的文件夹结构打包进入 JAR。
例如,如果项目中有 src/main/resources/logback.xml
文件,它会被打包成:
logback.xml
6. Spring Boot 项目中的特殊结构
如果你在 Spring Boot 项目中使用了 spring-boot-maven-plugin
插件来打包 JAR,生成的 JAR 文件会有更复杂的结构,包括以下内容:
BOOT-INF/classes/
: 存放编译后的项目代码和资源文件。BOOT-INF/lib/
: 存放所有依赖的第三方库。META-INF/
: 存放 JAR 元数据(如MANIFEST.MF
文件)。org/springframework/boot/loader/
: 包含 Spring Boot 的启动加载器类文件,使 JAR 可以通过java -jar
执行。
示例目录结构:
BOOT-INF/
classes/
com/
example/
MainClass.class
application.properties
lib/
spring-core-5.3.10.jar
jackson-databind-2.12.3.jar
META-INF/
MANIFEST.MF
org/
springframework/
boot/
loader/
JarLauncher.class
...其他类
7. 测试文件(通常不会包含在最终的 JAR 包中)
默认情况下,测试类和测试资源文件不会被打包进 JAR 中,因为这些文件位于 src/test/java/
和 src/test/resources/
,而 Maven 的打包目标不包含这些目录。如果需要将测试文件也打包,可以手动配置 Maven 的 build
设置。
总结
Maven 打包的 JAR 文件中一般会包含以下内容:
- META-INF 文件夹:存放 JAR 包元数据(如
MANIFEST.MF
)。 - 编译后的类文件:项目的
.class
文件,按包名划分。 - 资源文件:项目中
src/main/resources
目录下的文件。 - 第三方依赖(可选):如果使用了
shade
或spring-boot-maven-plugin
,第三方依赖会打包进 JAR。
希望对你有所帮助,若有问题欢迎指正~😊