SpringBoot项目打包成jar包供第三方使用实践

文章目录

  • 1.使用者手动配置 basePackages
    • 1.1 第三方jar项目
    • 1.2 使用者项目
      • 1.2.1 使用者配置
      • 1.2.2 项目测试
  • 2.使用者通过注解的方式引入
    • 2.1 第三方jar项目
    • 2.2 使用者项目
      • 2.2.1 使用者配置
      • 2.2.2 项目测试
  • 3.SpringBoot Starter 方式
    • 3.1 第三方jar项目
    • 3.2 使用者项目
      • 3.2.1 使用者配置
      • 3.2.2 项目测试

本文参考:

JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 - 蒋具宏 - 博客园 (cnblogs.com)

自己实现一个jar包(starter组件)_自己写的jar包-CSDN博客

1.使用者手动配置 basePackages

1.1 第三方jar项目

新建一个 springboot maven 工程,要被使用者导入的核心 Bean 代码如下:

package com.jxz.thirdpartyjar1;import org.springframework.stereotype.Component;@Component // 别的项目 @ComponentScan(basePackages={}) 可以扫描得到
public class ThirdPartyJarBeanOne {public void test() {System.out.println("我是外部方法");}
}

然后用 maven LifeStyle 方法中的 install 方法进行打包,会看到控制台输出如下

[INFO] Installing /Users/gabriel/Desktop/CodingUper/ThirdPartyJar1/pom.xml to /Users/gabriel/Environment/apache-maven-3.6.3/maven_repo/com/jxz/ThirdPartyJar1/0.0.1-SNAPSHOT/ThirdPartyJar1-0.0.1-SNAPSHOT.pom
[INFO] Installing /Users/gabriel/Desktop/CodingUper/ThirdPartyJar1/target/ThirdPartyJar1-0.0.1-SNAPSHOT.jar to /Users/gabriel/Environment/apache-maven-3.6.3/maven_repo/com/jxz/ThirdPartyJar1/0.0.1-SNAPSHOT/ThirdPartyJar1-0.0.1-SNAPSHOT.jar

/Users/gabriel/Environment/apache-maven-3.6.3/maven_repo/ 是我本地 maven 仓库的地址(在公司里就需要打到公网的 maven 仓库里去,这样子别人才能看到),这个时候其实就可以去去看到在 0.0.1-SNAPSHOT 下面就打出了 ThirdPartyJar1-0.0.1-SNAPSHOT.jar 包,这个 jar 包后续还需要导入别的项目使用

Bug:

有可能会碰到 maven 打包问题(repackage failed: Unable to find main class),原因是第三方 jar 包可能缺少主类,需要在 maven-plugin 处进行修改,参考 maven 打包问题(repackage failed: Unable to find main class)-CSDN博客

直接修改maven插件,改用apache的maven插件,配置如下:

 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId>
</plugin>

1.2 使用者项目

1.2.1 使用者配置

新建一个项目 Import3Party1 进行实验,先在 maven 中导入刚刚的 jar 包依赖

<dependency><groupId>com.jxz</groupId><artifactId>ThirdPartyJar1</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

为了便于测试,我这里再引入下 SpringBoot-web 的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.2.2 项目测试

配置方式:在启动类或者能够被 Spring 发现的 Configuration 类上增加 @ComponentScan(basePackages = {xxx 第三方 jar 包路径}),确保第三方Bean能够被扫描到

在这里插入图片描述

启动类:

package com.jxz.import3party1;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
// 启动类这里就需要带上第三方 jar bean 的路径 com.jxz.thirdpartyjar
@ComponentScan(basePackages = {"com.jxz.thirdpartyjar1","com.jxz.controller"})
public class Import3Party1Application {public static void main(String[] args) {SpringApplication.run(Import3Party1Application.class, args);}}

测试类:

package com.jxz.controller;import com.jxz.thirdpartyjar1.ThirdPartyJarBeanOne;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Controller
public class Import3Party1Controller {@AutowiredThirdPartyJarBeanOne thirdPartyJarBeanOne;@GetMapping(value = "/test1")@ResponseBodypublic String testApi(@RequestParam String accountId) {thirdPartyJarBeanOne.test();return accountId;}
}

经测试,输出正确

2.使用者通过注解的方式引入

其实就是把更多的工作交给 jar 包生成者去做了,通过注解的方式将 Bean 的导入进行了优化

2.1 第三方jar项目

在这里插入图片描述

要被使用者导入的核心 Bean 代码:

package com.jxz.thirdpartyjar2;import org.springframework.stereotype.Component;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Component
public class ThirdPartyJarBeanTwo {public void test() {System.out.println("我是外部方法");}
}

配置类:

package com.jxz.thirdpartyjar2.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Configuration
@ComponentScan(basePackages = {"com.jxz.thirdpartyjar2"}) // 扫描注册 bean
public class ThirdPartyJarBeanTwoConfig {
}

注解自动注册配置类:

package com.jxz.thirdpartyjar2.annotation;import com.jxz.thirdpartyjar2.config.ThirdPartyJarBeanTwoConfig;
import org.springframework.context.annotation.Import;import java.lang.annotation.*;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import({ThirdPartyJarBeanTwoConfig.class})
public @interface ThirdPartyJarBeanTwoAnnotation {
}

2.2 使用者项目

2.2.1 使用者配置

新建一个项目 Import3Party2 进行实验,先在 maven 中导入刚刚的 jar 包依赖

<dependency><groupId>com.jxz</groupId><artifactId>ThirdPartyJar2</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

为了便于测试,我这里再引入下 SpringBoot-web 的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2.2 项目测试

配置方式:只需要引入注解,注解上面都带上了自动导入的要素,会讲原先使用者需要扫描的 Bean 自动扫描

在这里插入图片描述

启动类:

package com.jxz.import3party2;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;@SpringBootApplication
// 启动类这里不需要带上第三方 jar bean 的路径
@ComponentScan(basePackages = {"com.jxz.controller"})
public class Import3Party2Application {public static void main(String[] args) {SpringApplication.run(Import3Party2Application.class, args);}}

测试类:

package com.jxz.controller;import com.jxz.thirdpartyjar2.ThirdPartyJarBeanTwo;
import com.jxz.thirdpartyjar2.annotation.ThirdPartyJarBeanTwoAnnotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Controller
// 这里就是第三方 jar 包中定义的注解
@ThirdPartyJarBeanTwoAnnotation
public class Import3Party2Controller {// 可以导入注入的 bean 使用@AutowiredThirdPartyJarBeanTwo thirdPartyJarBeanTwo;@GetMapping(value = "/test2")@ResponseBodypublic String testApi(@RequestParam String accountId) {thirdPartyJarBeanTwo.test();return accountId;}
}

经测试,输出正确

3.SpringBoot Starter 方式

3.1 第三方jar项目

此方法最关键的为 resources/META-INF/spring.factories 文件(特别注意:SpringBoot3更改了配置方式),当项目启动时,Spring会扫描所有jar包下面的 spring.factories 文件(SpringBoot3替换为了spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports *文件,参考下面说明*),进行相应的自动配置处理,其中写入类的全路径名

小于 SpringBoot 3 配置方法(resources/META-INF/spring.factories)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jxz.thirdpartyjar3.config.ThirdPartyJarBeanThreeConfig

其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 代表自动配置的 key,即代表需要自动配置哪些类,\ 可以理解为一个换行符,则该行下面的每行当做一个参数

第二行则为我们刚才看见的配置类的全路径,如果需要 Spring 自动配置多个类,我们依行写入它的全路径即可

大于等于SpringBoot3配置用法(resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)

com.jxz.thirdpartyjar3.config.ThirdPartyJarBeanThreeConfig

当做完这一步,我们的组件就可以打包了,然后使用者只需要引入我们的jar包,Spring 就会在启动时对我们 spring.factories 中的所有配置类进行自动配置(使用者会将第三方 jar 进行配置)

3.2 使用者项目

3.2.1 使用者配置

在这里插入图片描述

要被使用者导入的核心 Bean 代码:

package com.jxz.thirdpartyjar3;import org.springframework.stereotype.Component;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Component
public class ThirdPartyJarBeanThree {public void test() {System.out.println("我是外部方法");}
}

配置类:

同第二种配置方式

package com.jxz.thirdpartyjar3.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Configuration
@ComponentScan(basePackages = {"com.jxz.thirdpartyjar3"}) // 扫描注册 bean
public class ThirdPartyJarBeanThreeConfig {
}

主要是自动扫描文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:

com.jxz.thirdpartyjar3.config.ThirdPartyJarBeanThreeConfig

3.2.2 项目测试

新建一个项目 Import3Party3 进行实验,先在 maven 中导入刚刚的 jar 包依赖

<dependency><groupId>com.jxz</groupId><artifactId>ThirdPartyJar3</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

为了便于测试,我这里再引入下 SpringBoot-web 的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

不需要额外的配置,只需要上面引入了 pom 就能够自动扫描

在这里插入图片描述

启动类:

package com.jxz.import3party3;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = {"com.jxz.controller"}) // 还是需要能够扫描到 controller 的,默认扫描 com.jxz.import3party3
public class Import3Party3Application {public static void main(String[] args) {SpringApplication.run(Import3Party3Application.class, args);}}

测试类:

package com.jxz.controller;import com.jxz.thirdpartyjar3.ThirdPartyJarBeanThree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;/*** @Author jiangxuzhao* @Description* @Date 2024/2/3*/
@Controller
public class Import3Party3Controller {// 可以直接导入注入的 bean 使用@AutowiredThirdPartyJarBeanThree thirdPartyJarBeanThree;@GetMapping(value = "/test3")@ResponseBodypublic String testApi(@RequestParam String accountId) {thirdPartyJarBeanThree.test();return accountId;}
}

经测试,输出正确

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/451259.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3d C# 在WebGL平台加载并解析xml文件实现总结

前言 xml是可扩展标记语言&#xff0c;由一系列的元素、属性、值节点等构成的一个树形结构&#xff0c;除了可读性差一点&#xff0c;别的用于存储一些结构化的数据还是比较方便的。这个功能在Unity3d端的实现是比较方便快捷的&#xff1a; void GetXML1() {string filePath …

【Docker进阶】镜像制作-用Dockerfile制作镜像(一)

进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作用dockerfile制作镜像dockerfile是什么dockerfile格式为什么需要dockerfileDockerfile指令集合FROMMAINTAINERLABELCOPYENVWORKDIR 用dockerfile制作镜像 用快照制作镜像的缺陷&#xff1a; 黑盒不可重复臃肿 docker…

Python 轻量级定时任务调度:APScheduler

简述 APscheduler (Advanced Python Scheduler)&#xff0c;作用为按指定的时间规则执行指定的作业。提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。该框架不仅可以添加、删除定时任务&#xff0c;还可以将任务存储到数据库…

ES6中新增Array.of()函数的用法详解

new Array()方法 ES6为Array增加了of函数用一种明确的含义将一个或多个值转换成数组。因为用new Array()构造数组的时候&#xff0c;是有二意性的。 构造时&#xff0c;传一个参数&#xff0c;实际上是指定数组的长度&#xff0c;表示生成多大的数组。 构造时&#xff0c;传…

问题:媒体查询语法中, 可用设备名参数表示“文档打印或预览“的是 #媒体#媒体#其他

问题&#xff1a;媒体查询语法中, 可用设备名参数表示"文档打印或预览"的是 A、C.?screen B.?projection C、A.?print D.?speech 参考答案如图所示

【JavaEE】UDP协议与TCP协议

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

【大厂AI课学习笔记】1.4 算法的进步(4)关于李飞飞团队的ImageNet

第一个图像数据库是ImageNet&#xff0c;由斯坦福大学的计算机科学家李飞飞推出。ImageNet是一个大型的可视化数据库&#xff0c;旨在推动计算机视觉领域的研究。这个数据库包含了数以百万计的手工标记的图像&#xff0c;涵盖了数千个不同的类别。 基于ImageNet数据库&#xf…

如何构建多种系统架构支持的 Docker 镜像

如何构建多种系统架构支持的 Docker 镜像 1.概述2.解决方案3.使用manifest案例 1.概述 我们知道使用镜像创建一个容器&#xff0c;该镜像必须与 Docker 宿主机系统架构一致&#xff0c;例如 Linux x86_64 架构的系统中只能使用 Linux x86_64 的镜像创建容器 例如我们在 Linux…

从3天到3小时,“文思助手”让行业专业写作“文思泉涌”

AI 长文写作能否结合用户所在行业规范与需求&#xff0c;定制化体现专业内容&#xff1f;“文思助手”提供了解决方案。基于大语言模型强大理解和生成能力&#xff0c;通过用户自建知识库、个性化语境调整&#xff0c;能够智能地创作出符合专业要求的个性化长文。 厦门苏哒智能…

移动Web——less

1、less-简介 less是一个CSS预处理器&#xff0c;Less文件后缀是.less。扩充了CSS语言&#xff0c;使CSS具备一定的逻辑性、计算能力注意&#xff1a;浏览器不识别Less代码&#xff0c;目前阶段&#xff0c;网页要引入对应的CSS文件VS code插件&#xff1a;Easy LESS&#xff…

Canal 结合 SpringBoot 源码梳理

1、canal是什么&#xff0c;可以用来作什么 canal是阿里开源的一个用于监听数据库binlog&#xff0c;从而实现数据同步的工具。 2、安装 我使用的是1.1.5版本&#xff0c;太高的版本需要的jdk版本和mysql的驱动版本会更高&#xff0c;可以根据自己的环境选择。 如果是自己玩的话…

开源浏览器Firefox:使用Docker本地部署并远程访问进行测试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 部署Firefox二. 本地访问Firefox三. Linux安装Cpolar四. 配置Firefox公网地址…