【问题标题】:Docker Spring Boot project local Snapshot DependencyDocker Spring Boot 项目本地快照依赖
【发布时间】:2019-10-10 18:56:59
【问题描述】:

我正在学习 docker 来使用我的 Spring Boot 应用程序。我无法加载依赖项目的快照版本。 我有两个项目,项目 A 和项目 B。

这是我的 docker-compose 文件

version: '2.1'
services:
    projectA:
       build:
          context: ./projectA
          dockerfile: Dockerfile
       restart: always
       working_dir: /app
       command: mvn clean install
    projectB:
       build:
          context: ./projectB
          dockerfile: Dockerfile
       restart: always
       working_dir: /app
       command: mvn clean spring-boot:run

这会生成快照 Jar 项目A-1.1.0-SNAPSHOT.jar

我想在projectB中使用这个jar(Spring Boot Application)

我怎样才能在POM.xml中指向你这个本地jar

我的 POM 应该有

<dependency>
        <groupId>com.project.test</groupId>
        <artifactId>projectA</artifactId>
        <version>1.1.0-SNAPSHOT</version>
</dependency>

由于 SNAPSHOT 版本的更改,我在加载 projectB 时遇到错误。

谢谢,

这是我做 docker-compose up --build 时的输出

[ERROR] COMPILATION ERROR : 
[INFO] ----------------------------   
[ERROR].../com/project/test/api/assembler/UserMapper.java:
[57,54]    cannot find symbol
  symbol:   method getLastSessionTimestamp()
  location: variable user of type com.project.test.domain.User

lastSessionTimestamp 被添加到本地 SNAPSHOT Jar 中。

【问题讨论】:

  • 你能粘贴错误吗?
  • 无法编译 projectB 因为更改是在 projectA 中进行的本地 jar 不在 repo 中。
  • 你能先mvn clean install ProjectA 的文件夹吗?
  • 嗨 Mahendran,我能够生成 projectA jar,但是如何将该 jar 放入 projectB 依赖项中?
  • 转到本地 maven 存储库,查看是否有 projectA 的 1.1.0-SNAPSHOT 文件夹

标签: spring-boot docker docker-compose


【解决方案1】:

您的示例无法运行的原因是您对 docker (compose) 是什么以及它是如何工作的有一个误解。它不是 Java 库的包管理器,而是将整个应用程序包装在一起的工具。

所以详细配置如下: projectA 使用您的 Dockerfile 构建一个 docker 容器构建 projectA java 库,最后将打包的 jarfile 安装到 docker 容器本地文件系统 maven 文件夹中。此外,您正在尝试启动 projectB。这意味着你有两个问题:

  1. 正在运行的容器彼此不知道,因为它们不共享任何东西,但即使你会解决这个问题,例如通过在他们之间共享一个卷,你仍然有问题
  2. compose 并不暗示顺序,而是并行执行多个容器。因此,您可能会遇到它可能工作的情况,并且在下一次运行时将无法再次工作,因为 B 在 A 完成之前执行。

要解决这个问题,您有几个选择,我建议您执行以下操作: - 使用多模块 pom 文件在您的机器上的容器之外构建 A 和 B,该文件编排构建并且仅将最终 jar 添加到您可以发布的 docker 映像中。如果可行,您还可以在容器中执行构建。

但要简单地尝试您的两个构建都可以工作,您可以创建一个卷并将其安装在两个容器中的 maven 文件夹中,即 /root/.m2 假设您没有更改默认用户。

但我强烈建议您在这里阅读一下 docker 如何处理多阶段构建以及它如何处理卷:

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2019-08-02
    • 2019-03-14
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2019-07-28
    • 2021-04-05
    • 2011-10-24
    相关资源
    最近更新 更多