Spring Boot加载外部Jar包
项目有一个需求,需要通过
spring加载配置下的
Jar包,将
Jar包中的类注册成
Spring的一个Bean以供后续使用。
1、构建自己的ClassLoader。
关于java自己的ClassLoader的
加载方式,详情可移步此篇博客。
以下是我定义的
JarClassLoader,将
Jar包转换为URL,通过URLClassLoader去
加载。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
springboot启动时加载外部jar包
java -cp springboot-demo.jar:lib/* org.springframework.boot.loader.JarLauncher
需要指定多个jar或目录时,linux下使用冒号分隔,windows下使用分号分隔
web程序加载配置文件分为jar中的配置文件和jar外面的配置文件
修改jar中的配置文件需要使用压缩包方式打开并复制修改后的配置文件进入jar中(需要外部配置和内部配置替换)
springboot打包后只支持带jar外部的config中的application.properties的加载(通过外部文件控制启动行为),对于其他配置文件不能加载
由于一些外部原因,不能通过mavn来下载外部依赖,此时我们需要将自己的依赖手动打包到我们的项目中去,比如一些自定义的加解密等sdk,通过maven的方式将jar包加入项目。
首先,我们需要单独处理下我们的私有包,将所有依赖准备好,在maven中加入相关打包插件
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
属性文件是一种常见的方法,可用于存储特定于项目的信息。 理想情况下,应该将其保留在jar包外部,以便能够根据需要更改配置。
接下来通过各种方式从Spring Boot应用程序中jar外部的位置加载属性文件。
2.使用默认位置
按照惯例,Spring Boot按照以下优先级顺序在4个预定的位置中寻找一个外部化的配置文件– application.properties或application.yml:
当前目录的/config子目录
类路径/config包
加载冲突时,优先级高
1、在项目 根目录下创建 libs
包
2、将
jar包放入 libs 目录里。
3、在maven pom.xml 中配置
jar文件。1、在项目 根目录下创建 libs
包2、将
jar包放入 libs 目录里。
3、在maven pom.xml 中配置
jar文件。 <dependencies>。。。其他 配置 。。。 <dependency>
1.1 springboot启动会扫描一下位置的application.properties或者application.yml作为默认的配置文件
工程根目录:./config/
工程根目录:./
classpath:/config/
classpath:/
加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置
也可以通过指定配置spring.config.location来改变默认配置,一般在项目已经打包后,我们可以通过指令 java -jar x
当我们把代码打
包成
jar包时,properties文件是写死在
jar包中的,不可修改。一旦我们要修改properties文件,就要再重新打
包成
jar包,再发布。非常麻烦!可不可以在
外部配置properties,启动
jar包时
加载这个配置文件呢?有!
解决方案:
1.以Windows为例,准备一个你自己的
jar包
2.在同目录下,创建一个myApplication.properties
内容如下:
# 这里书写规则跟正常的application.properties一样
server.po
在项目中,有时候需要引入外部jar包,启动运行。有两种方式,一种是直接在项目中添加jar包,另一种是在本地maven仓库中添加jar包,然后在pom.xml文件中引入依赖。
第一种方式:在项目中添加jar包
step1:在src/main/resources下创建lib目录,然后将jar包放在该目录下
step2:然后在project structure中引入该lib
第二种方式:在pom.xml文件中引入外部jar包
step1:通过命令行方式,在本地maven仓库中添加jar包
打开cmd,
要扫描Spring Boot JAR包中的JAR的类,可以使用Spring Boot的自动类扫描功能。在Spring Boot应用程序中,可以使用@SpringBootApplication注释启用自动扫描,它将扫描主应用程序所在包中的所有类和其子包,因此可以启用反射技术来查找和加载其他JAR包中的类。如果要扫描特定的类,可以使用@ComponentScan注释指定要扫描的包名。
除了自动扫描之外,还可以使用ClassLoader类的方法来扫描JAR包中的类,例如getResources()方法可以获取JAR包中所有的资源,然后使用反射技术来查找并加载类。
需要注意的是,在扫描JAR包中的类时,可能会遇到JAR包冲突的情况,即不同版本的JAR包中存在相同的类,这会导致类加载错误和应用程序异常。为了解决这个问题,可以使用Maven或Gradle等构建工具来管理依赖关系,确保使用的JAR包版本一致。同时,可以使用Spring Boot的exclude属性排除某些JAR包,或使用@ConditionalOnMissingBean注释来避免应用程序中同名的多个bean。
总之,扫描Spring Boot JAR包中的JAR的类需要使用反射技术和自动类扫描功能,同时需要注意依赖关系和JAR包冲突等问题。