【发布时间】:2020-03-26 11:49:44
【问题描述】:
我对 Java 和 Spring 还是很陌生。我正在寻找一个容器化的解决方案来监视src 文件夹,重建项目并利用 Spring devtools hotswap 重新加载更改的类。
我搜索过,但我一直在寻找可用于生产的容器,构建和运行的步骤是分开的。我尝试使用 2 个不同的容器,一个带有持续构建的 Gradle (gradle build --continuous),另一个用于执行构建结果:
version: '3.7'
services:
builder:
image: gradle:jdk11
working_dir: /home/gradle/project
volumes:
- ./:/home/gradle/project
command: gradle build --continuous
api:
image: openjdk:11-slim
volumes:
- ./build/classes:/app
command: java -classpath /app/java/main com.example.Application
它失败是因为 Java 在 api 容器中找不到依赖项(Spring、devtools、h2 等),而且我不知道如何让 Gradle 将外部 jar 包含在构建文件夹中。我想做点事情like this,只是例子已经过时了。
不过,我一直认为可能会有更优雅、更简单的解决方案。不一定要使用 Gradle,如果可以,它可以是 Maven! :)
我知道很多 IDE 都支持自动构建和开发工具,我只是想在 Docker 上实现它。这样,我将拥有一个在存储库上而不是在 IDE 配置上的开发工作流,并且几乎与任何开发环境兼容。这是个坏主意吗?
【问题讨论】:
-
VSCode 允许在 container 内进行开发。例如,您可以构建一个已安装所有依赖项的开发映像。关于热插拔,我不确定它如何与 spring 一起工作,但它与 node 一起工作得很好,我想它与 Java 差不多。
-
不,在这个用例中使用 Docker 并不是一个坏主意。
gradle --continuous build将起作用。我不确定 Gradle 无法找到 Spring 库是什么意思。如果它作为依赖项列在您的build.gradle中,则应在运行gradle --continuous build时安装它。至于您的api服务,最好设置ports以便您可以在容器外访问它。这是我的docker-compose.dev.yml的示例。 -
是的,我在 Node 的每一种风格中都广泛地看到了它,所以我很惊讶这样一个基本的功能很难用 Java 实现。
-
@NeelKamath 感谢您分享您的示例。据我所知,您的 Gradle 容器在启动时构建,然后运行。如果代码更改,它不会重建和重新运行,是吗?为了清楚起见,我编辑了关于 Gradle 和 Spring 依赖项的部分。
-
@AlessandroCappello 我在较新的 cmets 中链接到的文件中使用了
--continuous。我的第一条评论的docker-compose.dev.yml使用-t而不是--continuous,但它们是同一个标志。
标签: java spring maven docker gradle