我正在寻找一个解决方案来制作一个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)
有可能实现吗? 任何建议/解决方案都将不胜感激。
答案 0 :(得分:2)
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。
当Spring Boot应用程序执行组件扫描,尝试加载配置文件等时,它将使用类路径来执行此操作,即,如果文件和类位于主jar文件中或者一个文件和类中,则无关紧要嵌套的jar文件,因为它们都在类路径中。只要您对自己的代码中使用的任何资源加载采用相同的方法(使用classpath:/
前缀资源位置),您就不会有任何问题。
答案 1 :(得分:0)
安迪 是的,我知道Spring Boot的Maven插件可以处理它。我只想检查它是否以这种方式工作。我想知道Spring Boot是否可以从嵌套的jar文件中执行以下操作:
顺便说一句, 你是对的,使用过的Spring Boot是1.0.2.RELEASE,它已经老了,我稍后会升级它。