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

有没有办法制作一个与多个不同组件共享的基本spring引导组件?,spring,spring-mvc,spring-boot,Spring,Spring Mvc,Spring Boot,我正在寻找一种解决方案来制作一个通用的spring引导组件,以避免许多重复文件 在几个不同的组件中。即: 基于spring boot构建了两个组件(比如C1和C2)来提供RESTful服务,这两个组件中都使用了swagger来显示生成的API文档,生成的胖jar如下所示: C1.jar │ logback-access.xml │ logback.xml ├─com.host.c1.* ├─db ├─lib ├─logging │ logback-access-base.xml │

我正在寻找一种解决方案来制作一个通用的spring引导组件,以避免许多重复文件 在几个不同的组件中。即: 基于spring boot构建了两个组件(比如C1和C2)来提供RESTful服务,这两个组件中都使用了swagger来显示生成的API文档,生成的胖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 
这样,基于基本组件的新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)
有可能实现吗? 任何建议/解决方案都将不胜感激。

创建可执行jar Spring引导要求创建嵌套项。问题是您已经手动构建了jar,因此压缩了嵌套的jar文件。SpringBoot的Maven和Gradle插件将为您解决这个问题。或者,如果您想继续手工构建jar,应该可以禁用压缩,但这取决于您使用的工具。例如,如果您在OS X上使用
zip
,则Zstore将使其存储条目而不进行压缩

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

组件扫描和从嵌套JAR加载配置 当Spring Boot应用程序正在执行组件扫描、尝试加载配置文件等操作时,它将使用类路径来执行此操作,即,文件和类是在主jar文件中还是在嵌套jar文件中并不重要,因为它们都在类路径上。只要对任何资源加载采用与在自己的代码中相同的方法(使用
classpath://
前缀资源位置),就不会有任何问题。

Andy, 是的,我知道SpringBoot的Maven插件可以解决这个问题。我只是想检查一下它是否是这样工作的。我想知道Spring Boot是否可以从嵌套的jar文件中很好地执行以下操作:

  • 加载日志配置
  • 扫描并启动带注释的组件、控制器、拦截器等
  • 顺便说一句,
    你说得对,使用的Spring Boot是1.0.2.RELEASE,它很旧,我以后会升级。

    “无法打开嵌套的压缩项”。应该给你一个线索。您是如何构建jar文件的(嵌套文件和外部文件)?如果你使用像Maven和Gradle这样的标准构建工具,这种情况就不会发生。我先用Maven构建了jar文件,然后通过WinRAR从中删除了不必要的文件,以手动创建一个通用jar来测试它。WinRAR可能就是罪魁祸首。您可以使用SpringBootMaven插件用嵌套的lib dir构建一个jar,所以我建议您这样做。我认为这应该作为一个注释发布,因为它不是您问题的答案。我已经更新了我的答案,也涵盖了你问题的这一部分。知道了。谢谢你的提及。:)非常感谢您对组件扫描和配置加载的解释,我很清楚。我认为它应该通过以下步骤很好地工作:1。通过使用maven jar插件而不是Spring Boot的maven插件,将我的BaseComponent构建为一个通用jar文件。2.将BaseComponent的依赖关系添加到C1和C2的POM中
    3。使用Spring Boot的Maven插件构建C1和C2,并让BaseComponent.jar包含在“lib”中
    应该可以正常工作,对吗?检查后我会告诉您结果。为什么即使在注释中的行尾添加了两个空格也不能添加特征线?帮助中说:“换行符:用两个空格结束一行以添加一个
    换行符”@Anndy谢谢,当POMs相应修改后通过特定maven插件生成的jar时,它会起作用。