问题:
最近在尝试制作自己的工具包时,按照规范实现了自动配置类、属性配置类,实体类和工具类,并在META-INF中指定了自动配置类的位置
随后,我使用maven的默认打包形式并在demo中引入了依赖,此时依赖是没有报错的
但当我在Test中自动注入依赖库的实体类时,类名报红,idea提示可以导入类,但点击后无效,且尝试手动导包时依赖名报红,此时我检查pom.xml与外部库文件都是正常导入了依赖的。
尝试排错许久后,我开始对比之前成功使用的简易starter的jar包,果然发现它们的软件包名(即反域名:com.xxx.xxx)存储的路径不一样,在简易starter中,软件包名与META-INF同级;而在自制工具类中,软件包名打包后被存在了BOOT-INF目录下的classes文件中(此时BOOT-INF与META-INF同级,软件包为三级)。
用图直观展示:
下图为不使用maven插件打包的jar包目录结构
下图为使用maven插件默认打包的jar包目录结构
解决方式:
将maven插件删除后直接进行打包:
(删除此plugin后执行打包指令“mvn clean install”)
总结:
1. 可执行性
使用 spring-boot-maven-plugin 的 JAR 包:这种 JAR 包是可执行的,包含了一个内嵌的容器(如 Tomcat),可以直接通过 java -jar 命令启动应用。
不使用插件的 JAR 包:这种 JAR 包通常是普通的库文件,不能直接运行。它们通常用于作为依赖库被其他项目引用。
2. 依赖管理
使用 spring-boot-maven-plugin 的 JAR 包:这种 JAR 包会将所有依赖项打包到一个单独的 JAR 文件中,形成一个“胖 JAR”(fat JAR)。这样可以确保所有依赖项都包含在内,便于部署和运行。
不使用插件的 JAR 包:这种 JAR 包通常只包含项目的编译类文件,不包含任何依赖项。运行时需要手动配置依赖项。
3. 结构
使用 spring-boot-maven-plugin 的 JAR 包:这种 JAR 包有一个特定的目录结构,通常包含 BOOT-INF 目录,其中包含应用的类文件和依赖项。
不使用插件的 JAR 包:这种 JAR 包的目录结构通常比较简单,只包含项目的类文件。
4. 启动方式
使用 spring-boot-maven-plugin 的 JAR 包:可以通过 java -jar your-app.jar 直接启动应用。
不使用插件的 JAR 包:需要通过类路径指定所有依赖项,例如 java -cp your-app.jar:dependency1.jar:dependency2.jar com.yourcompany.YourMainClass。
5. 配置
使用 spring-boot-maven-plugin 的 JAR 包:插件会自动处理许多配置,如主类的识别、依赖项的打包等。
不使用插件的 JAR 包:需要手动配置这些细节,包括主类的指定和依赖项的管理。
总结
使用 spring-boot-maven-plugin 的 JAR 包:适合独立运行的应用,包含所有依赖项,易于部署和运行。
不使用插件的 JAR 包:适合作为库文件被其他项目引用,不包含依赖项,需要手动管理依赖
疑惑:
可执行的jar包应该如何使用