【问题标题】:Spring boot in docker with two jars带有两个罐子的 docker 中的 Spring Boot
【发布时间】:2019-02-07 06:53:11
【问题描述】:

任务是扩展现有的spring boot应用程序并覆盖一些bean并将其部署在spring boot中。

使用 Kotlin 语言。 所以我有spring boot应用程序(APP-A)

    @SpringBootApplication
    open class MyApp { 
        ... //start staff here 
    }

我有一个模块 (MODULE-B),它通过依赖注入扩展了一些现有逻辑

open class ExtensionModule { 
//... extension logic is here 
}

对于这个模块,使用了弹簧自动配置。所以应该在spring容器中注册

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.ExtensionModule

当我在 pom.xml(APP-A) 中依赖 MODULE-B 时,一切正常。 我的目标是在 pom.xml 中构建一个没有依赖关系的 docker 映像,因此在这种情况下,APP-A 对 MODULE-B 一无所知,但逻辑将被扩展,就像旧的基于 spring 容器 classpath-xml 的方法一样 我用下一个 Dockerfile 测试过

FROM openjdk:8-jre

ADD app-a.jar /usr/share/jvmservice/app-a.jar
ADD module-b.jar /usr/share/jvmservice/module-b.jar

ENTRYPOINT exec /usr/bin/java $JAVA_OPTS -jar /usr/share/jvmservice/app-a.jar

结果是 app-a 成功启动,但没有应用来自 module-b 的更改。 是否可以在一个 spring 容器中使用两个 jar 组合 docker 映像,而无需显式依赖?

【问题讨论】:

  • 暂时忘记了 docker,你能给我一个命令如何在本地启动你的 APP-A(假设在构建 APP-A 时模块 B 不包含在它的依赖项中)并且它的工作方式你想要吗?
  • 在 IntelliJ IDEA 中,我只运行 Spring Boot 应用程序“MyApp”的主类,在 pom.xml 中具有依赖关系,它与自动配置的 MODULE-B 一起工作正常
  • 如果 MyApp 不知道模块 B,就无法在 MyApp 中使用模块 b 功能。所以,现在如果你同意将模块 b 作为依赖项,那么请按照这里给出的@Ilya 回答。

标签: spring spring-boot docker


【解决方案1】:

您需要将module-b.jar 添加到类路径中,使用以下方法来做到这一点

FROM openjdk:8-jre

COPY app-a.jar /usr/share/jvmservice/app-a.jar
COPY module-b.jar /usr/share/jvmservice/ext/module-b.jar

ENTRYPOINT exec /usr/bin/java $JAVA_OPTS -Dloader.path="/usr/share/jvmservice/ext/" -jar /usr/share/jvmservice/app-a.jar

欲了解更多信息,请参阅Launching Executable Jars

【讨论】:

  • 感谢您的回答。尝试了您建议的解决方案,还尝试仅放入 /lib 文件夹,这应该是传递 jar 组件的默认位置。放置在“/lib”文件夹中的库可以正确使用,但是带有一些 spring Autoconfigurable 模块的 jar 根本不会自动配置。似乎需要告诉spring容器将jar添加到容器中
  • 这篇文章aboullaite.me/…做了类似的事情。是否有可能以某种方式了解哪些 jars 位于类路径中?当自动配置模块位于类路径中时,应用程序似乎应该可以正常工作,但由于某种原因没有任何反应
  • 好吧,好像应该加到manifest文件里,不是很方便stackoverflow.com/questions/39716796/…
  • 我不确定我得到了你们的 cmets。您的意思是弹簧自动配置不适用于从 loader.path 加载的 jar 吗?
  • 是的。应该将它们添加到类路径的主要原因。请参阅上面的 stackoverflow 链接。它可以通过修改清单文件来完成,或者像 ENTRYPOINT exec /usr/bin/java -cp ""$JAVA_OPTS
    来完成。它适用于这样两个选项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 2017-06-03
  • 2015-02-14
  • 1970-01-01
  • 2021-05-14
  • 2018-08-10
  • 1970-01-01
相关资源
最近更新 更多