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.rhkb.cn/news/252149.html

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

相关文章

linux、windows 安装 vue-cli

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统&#xff0c;提供&#xff1a; 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service) 可升级&#xff1b; 基于 webpack 构建&#…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0&#xff0c;标识SDS没有分配任何未使用空间。len 属性值为5&#xff0c;标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组&#xff0c;数组的前5个字节保存了&#xff0c;R e d i s 五个字符&#xff0c;最后一个保存空字符串 \0…

Cassandra 命令大全

文章目录 1. 连接与基本操作2. 数据库管理3. 表&#xff08;Column Family&#xff09;操作4. 集群管理5. 权限管理6. 其他高级功能7. 条件查询与聚合操作8. 索引管理9. 用户权限和角色管理10. 安全性相关设置11. 一致性级别控制12. 用户定义类型 (UDTs)13. 用户定义函数 (UDFs…

【C生万物】C语言数据类型、变量和运算符

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

亚信安慧AntDB推动技术创新与满足用户需求

随着互联网技术的迅猛发展&#xff0c;大数据时代的到来&#xff0c;数据库的需求不断增长。在这样的背景下&#xff0c;国产分布式数据库正逐渐崭露头角&#xff0c;AntDB作为其中的重要代表&#xff0c;也积极参与到了这场竞争中。作为国内的技术创新者&#xff0c;AntDB不仅…

Solidworks 与 MATLAB 联合仿真

本文主要讲解了“MATLAB与SolidWorks的联合仿真怎么实现”&#xff0c;文中的讲解内容简单清晰&#xff0c;易于学习与理解&#xff0c;下面请大家跟着小编的思路慢慢深入&#xff0c;一起来研究和学习“MATLAB与SolidWorks的联合仿真怎么实现”吧&#xff01; 下载插件。 1、…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…

Python flask 模板详解

文章目录 1 概述1.1 模板简介1.2 templates 文件1.3 简单应用 2 模板语法2.1 for 循环2.2 if 判断 3 模板的继承3.1 格式要求3.2 实现示例3.3 复用父模板的内容&#xff1a;super 1 概述 1.1 模板简介 定义&#xff1a;定义好的 html 文件&#xff0c;用于快速开发 web 页面J…

计算机毕业设计 | SSM 校园线上订餐系统(附源码)

1&#xff0c; 概述 1.1 项目背景 传统的外卖方式就是打电话预定&#xff0c;然而&#xff0c;在这种方式中&#xff0c;顾客往往通过餐厅散发的传单来获取餐厅的相关信息&#xff0c;通过电话来传达自己的订单信息&#xff0c;餐厅方面通过电话接受订单后&#xff0c;一般通…

Vue 上门取件时间组件

本文使用vue2.0elementui 制作一个上门取件时间组件&#xff0c;类似顺丰&#xff0c;样式如下&#xff1a; 大概功能&#xff1a;点击期望上门时间&#xff0c;下面出现一个弹框可以选择时间&#xff1a; 首先我们定义一些需要的数据&#xff1a; data() {return {isDropdown…

算法学习——LeetCode力扣链表篇1

算法学习——LeetCode力扣链表篇1 203. 移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 示例 …

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

进程和线程的区别详解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 进程 进程在系统中是如何管理的 进一步认识PCB 线程 能否一直增加线程数目来提高效率 进程和线程…

SpringMVC精简知识点

SpringMVC 数据格式化基本数据类型和字符串自动转换特殊数据类型和字符串自动转换 验证及国际化应用实例注意事项和使用细节注解的结合使用数据类型转换校验核心类-DatBinder取消某个属性的绑定中文乱码解决处理json和HttpMessageConverter<T>作业布置SpringMVC文件上传自…

HashCat 恢复Excel、Word、PPT密码保姆教程

HashCat 恢复Excel、Word、PPT密码 一、流程 整体需要两个步骤 先用office2john.py获取下文件的hash值 python office2john.py 1.xlsx > hash这个命令需要你电脑有python环境&#xff0c;然后在cmd命令窗口中执行此命令就行 文件链接&#xff1a;https://github.com/magnu…

CSS的Day05(浮动+flex布局)

跟着黑马程序员的课&#xff0c;稍稍对CSS的了解 常见的显示模式&#xff1a;行内、块级、行内块 在HTML中&#xff0c;标准流也称为文档流或普通流&#xff0c;是指元素按照其在HTML文档中的出现顺序依次排列的方式。在标准流中&#xff0c;元素会自动占据父容器的空间&#…

《云原生安全攻防》-- 云原生安全概述

从本节课程开始&#xff0c;我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前&#xff0c;让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生&#xff08;Cloud Native&#xff09;是一个组合词&#xff0c;我们把它拆分为云和原生两个词来…

bitcoin core 请求拒绝响应【或者】卡死

日志 经过排查节点日志&#xff0c;发现抛出异常。 tail -f debug.log日志&#xff1a; 2024-02-05T05:56:26Z BlockUntilSyncedToCurrentChain: txindex is catching up on block notifications 2024-02-05T05:56:26Z BlockUntilSyncedToCurrentChain: txindex is catching…

如何以管理员身份删除node_modules文件

今天拉项目&#xff0c;然后需要安装依赖&#xff0c;但是一直报错&#xff0c;如下&#xff1a; 去搜这个问题会让把node_modules文件先删掉 再去安装依赖。我在删除的过程中会说请以管理员身份来删除。 那么windows如何以管理员身份删除node_modules文件呢&#xff1f; wi…