随笔记:SpringBoot引入第三方jar包并包扫描问题

news/2025/2/22 6:20:27

背景说明:

有两个SpringBoot工程(代号A:标准产品,代号B:产品定制)

代号B工程是一个空壳子工程,包结构如下图:分为接口包和实现包两个

在代号A工程中配置好 @ComponentScan ,并在pom.xml中引入实现包后,发现代码A工程在启动的时候并不会去扫描代号B的实现包,仅仅是扫描接口包(因为实现包需要依赖接口包,故在引入实现包后接口包也会被引入),而且接口包中接口虽在实现包中已实现,但是在包扫描中仍然会被认为是 Ignored because not a concrete top-level class

这里代码有点问题,Java类名字重复

感觉应该和打包出来之后的文件路径有关系,可以从如何扫描到包的方式入手,其实就是读取jar包文件

没明白为啥 

--------------------------------------分割线,下面是SpringBoot打包东西-------------------------------------------

SpringBoot项目打包有关BOOT-INF文件夹问题

1、.spring-boot maven打包,一般pom.xml文件里会加

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

这样打的jar里会多一个目录BOOT-INF。

2.引起问题,程序包不存在。

3.解决办法,如果A子模块包依赖了B子模块包,在B子模块的pom文件,加入

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!--如果添加次配置,jar包不会有任何依赖-->
        <skip>true</skip>
    </configuration>
</plugin>

或者将B子模块的pom打包改成

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
      <!--  添加编译插件 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>

--------------springboot打包部署-------------------------------------------------------------------------------

一、打成jar部署

利用springboot的插件打包

<plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

 如果要引入本地jar配置,如下图

pom.xml配置如下

<dependency>
            <groupId>eis_protobuf</groupId>
            <artifactId>eis_protobuf</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/eis_protobuf.jar</systemPath>
        </dependency>

springboot-maven-plugin打包的第一级目录为Boot-INF,如果不做任何配置,直接mvn clean package会发现无法把本地的jar打进Boot-INF中,则此时要做如下配置 

方法一

在pom.xml的resources节点添加如下内容

<resource>
     <directory>lib</directory>
      <targetPath>BOOT-INF/lib/</targetPath>
      <includes>
         <include>**/*.jar</include>
      </includes>
</resource>

 ps: 如果遇到一些外部配置文件比如mybatis的mapper文件或者activiti生成器的json文件,则也要把相应的文件打进resources中,否则项目启动会因找不到配置文件,而报错,配置文件如下

<resource>
                <directory>${basedir}/src/main/java</directory>
                <filtering>false</filtering>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>templates/**</exclude>
                    <exclude>static/**</exclude>
                </excludes>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.yml</include>
                    <include>**/*.yaml</include>
                    <include>**/*.properties</include>
                    <include>**/*.key</include>
                    <include>**/*.des</include>
                    <include>**/*.template</include>
                    <include>**/*.json</include>
                </includes>
            </resource>

方法二

在spring-boot-maven-plugin插件中设置includeSystemScope参数

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <includeSystemScope>true</includeSystemScope>
      </configuration>
    </plugin>
  </plugins>
</build>

二 把sprinboot项目达成war包部署到外部tomcat

1、修改打包方式,把jar改成war,改成如下配置

<packaging>war</packaging>

2、引入tomcat依赖jar,scope范围为provided,并排除springboot内嵌的tomcat依赖jar,其实不排除也没关系,不影响项目运行

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3、修改打包插件,不使用spring-boot-maven-plugin插件打包,因为这个打包插件会把jar打包在Boot-INF目录下导致别的项目引用时引用不到,此时改用maven-war-plugin打包,具体配置如下

<plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>2.3.2</version>
         <configuration>
            <source>1.8</source>
            <target>1.8</target>
         </configuration>
</plugin>

4、修改启动类,启动类继承SpringBootServletInitializer,并重写configure方法

@SpringBootApplicationpublic class SpringbootDemo extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SpringbootDemo.class);
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(SpringbootDemo.class).web(true).run(args);
    }
}

 

参考资料:

1、springboot打包部署的那些事-腾讯云开发者社区-腾讯云

2、spring-boot子模块打包去掉BOOT-INF文件夹_spring-boot项目打包去掉boot-inf文件夹-CSDN博客


http://www.niftyadmin.cn/n/5861773.html

相关文章

HarmonyOS 开发套件 介绍 ——上篇

HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。而HarmonyOS&#xff0c;作为华为推出的全新操作系统&#xff0c;正以其独特的魅力和强大的功能&#xff0c;吸引着越来越多的开发者和用户的…

计算机网络:应用层 —— 域名系统 DNS

文章目录 什么是域名系统 DNS&#xff1f;域名系统DNS的作用域名结构顶级域名二级域名因特网的域名空间 域名服务器域名解析的过程递归查询迭代查询 DNS本地高速缓存总结 什么是域名系统 DNS&#xff1f; 域名系统&#xff08;DNS&#xff0c;Domain Name System&#xff09;是…

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号&#xff0c;都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…

rpc和http的区别,为啥golang使用grpc 不使用http?

RPC 和 HTTP 的区别 概念层面 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;&#xff1a;是一种允许程序调用另一个地址空间&#xff08;通常是共享网络上的另一台机器&#xff09;中的过程或函数的技术&#xff0c;就像调用本地函数一样自然。…

【Pandas】pandas Series sample

Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐&#xff0c;使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…

MySQL 插入更新语句(insert…on duplicate key update语句 )

我们日常在使用 insert into 语句向表中插入数据时&#xff0c;一定遇到过主键或唯一索引冲突的情况&#xff0c;当遇到这种情况时&#xff0c;MySQL默认的反应是报错并停止执行后续的语句&#xff0c;为了避免这种情况&#xff0c;你有3种选择&#xff1a; 使用insert ignore…

【中间件开发】kafka使用场景与设计原理

文章目录 前言一、MessageQueue1.1 定义1.2 使用消息队列的场景1.2.1 异步处理1.2.2 流量控制1.2.3 服务解耦1.2.4 发布订阅1.2.5 高并发缓冲1.3 基本概念和原理1.3.1 点对点消息队列模型 -- 线程池1.3.2 发布订阅消息模型-Topic --上课通知1.3.3 消息的ACK确认机制 二、Kafka2…

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制&#xff1f;2.2 如何将注意力机制集成到YOLOv8中&#xff1f;2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块&#xff1f;3.3 效果分析 4. 卷积操作的优化4.1 卷积操…