有没有办法制作一个与几个不同组件共享的基本弹簧引导组件?

时间:2014-10-01 07:37:55

标签: spring spring-mvc spring-boot

我正在寻找一个解决方案来制作一个common-spring-boot组件来避免许多重复文件 在几个不同的组件中。即: 有两个基于spring-boot构建的组件(比如C1和C2)来提供RESTful服务,两者都使用swagger来显示生成的API文档,生成的fat jar看起来像:

C1.jar
│  logback-access.xml
│  logback.xml
├─com.host.c1.*
├─db
├─lib
├─logging
│      logback-access-base.xml
│      logback-base.xml
├─META-INF
├─org. springframework.boot.loader
└─static
    └─swagger.ui.app 

C2.jar与C1.jar几乎相同,但包名不同(com。 host.c2。* )。

我们可以看到这两个组件中有许多重复文件,我想制作一个通用组件来包含所有公共资源和配置文件,以保持组件结构清洁,例如:

 BaseComponent.jar 
 │  logback-access.xml
 │  logback.xml
 ├─com.host.base.*
 ├─lib
 ├─logging
 │      logback-access-base.xml
 │      logback-base.xml
 ├─META-INF
 ├─org. springframework.boot.loader
 └─static
     └─swagger.ui.app 

通过这种方式,基于BaseComponent的新C1和C2看起来像:

 C1.jar
 ├─com.host.c1.*
 ├─lib ... BaseComponent.jar

 C2.jar
 ├─com.host.c1.*
 ├─lib ... BaseComponent.jar

我手动尝试了这个但是没有用,但是在运行修改后的jar时会出现以下情况:

  java.lang.IllegalStateException: Unable to open nested compressed entry lib/BaseComponent.jar
    at org.springframework.boot.loader.jar.JarFile.getNestedJarFileFromFileEntry(JarFile.java:342)
    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:312)
    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:87)
    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:74)
    at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:56)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:60)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:45)

有可能实现吗? 任何建议/解决方案都将不胜感激。

2 个答案:

答案 0 :(得分:2)

创建可执行jar

Spring Boot要求嵌套条目为stored without any compression。问题是您手动构建了jar,因此压缩了嵌套的jar文件。 Spring Boot的Maven和Gradle插件将为您解决这个问题。或者,如果您想继续手动构建jar,应该可以禁用压缩,但它依赖于您正在使用的工具。例如,如果您在OS X zip上使用-Zstore将使其存储没有压缩的条目。

另外,堆栈跟踪中显示的方法仅存在于旧版本的Spring Boot中(1.1.1是具有它们的最新版本)。它与此问题无关,但我建议升级到1.1.7。

嵌套jar中的组件扫描和加载配置

当Spring Boot应用程序执行组件扫描,尝试加载配置文件等时,它将使用类路径来执行此操作,即,如果文件和类位于主jar文件中或者一个文件和类中,则无关紧要嵌套的jar文件,因为它们都在类路径中。只要您对自己的代码中使用的任何资源加载采用相同的方法(使用classpath:/前缀资源位置),您就不会有任何问题。

答案 1 :(得分:0)

安迪 是的,我知道Spring Boot的Maven插件可以处理它。我只想检查它是否以这种方式工作。我想知道Spring Boot是否可以从嵌套的jar文件中执行以下操作:

  1. 加载日志配置
  2. 扫描并启动带注释的组件,控制器,拦截器等
  3. 顺便说一句, 你是对的,使用过的Spring Boot是1.0.2.RELEASE,它已经老了,我稍后会升级它。