springboot启动时加载外部jar?

现有一个springboot项目,通过扫描二维码查询信息,比如一棵树,扫描二维码后可以看到他相关的信息。但这个项目不止有树类型,还有道路,某个物品。所以将项目分模块开发,核心模块作为一个jar包,复制提供基础服务如数据导入导出。各类型构建成单独的jar。部署时需要那种类型就加载对应的jar。这样做是为了满足不同客户需求。
尝试:

  1. java -Xbootclasspath/a:file:./libs -jar main.jar,运行后并没有加载libs中的jar
  2. java -Djava.ext.dirs=file:./libs -jar main.jar,启动异常

    错误: 找不到或无法加载主类 .ext.dirs=file:..libs

    原因: java.lang.ClassNotFoundException: /ext/dirs=file://libs

  3. java -Dloader.path=file:./libs -jar main.jar 与第2种一样错误

请问需要使用什么方式才能在启动时同时加载外部jar呢?


回答:

java -classpath './libs*:main.jar' org.springframework.boot.loader.launch.JarLauncher

# or

java -cp './libs*:main.jar' org.springframework.boot.loader.launch.JarLauncher

使用 -jar 启动时,-cp 会被忽略。

因此只能将运行 jar 也放入 -cp 中,再使用 main 类启动。

spring boot 的 main 类,打包成 jar 时,会变为 org.springframework.boot.loader.launch.JarLauncher


回答:

这个需要你实现一套插件加载机制。下面是我写的一个示例项目:

https://github.com/yiding-he/spring-boot-plugin-demo

这是一个在 Spring Boot 项目中实现插件机制的例子。其中包含三个模块:

  • plugin-api:插件接口
  • plugin-sample:插件实现
  • main-service: 使用插件的主服务

其中 main-service 和 plugin-sample 都依赖 plugin-api 模块。

这个插件机制的特点在于:

  1. 插件独立开发打包,不依赖主服务的代码;
  2. 插件的加载使用单独的类加载器,避免插件和主服务之间相互依赖;
  3. 插件加载后自动被纳入 Spring IoC 容器管,并可以使用容器提供的各种环境;

运行方法:

  1. 首先对整个项目执行 mvn package,生成的插件包会输出到 plugins 目录下;
  2. 运行 main-service 项目,启动后会自动加载插件包并执行对应的逻辑;

以上是 springboot启动时加载外部jar? 的全部内容, 来源链接: utcz.com/p/945530.html

回到顶部