首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >慢开发工作流/ Java反馈循环与Docker:我是否需要在每次更改后重建JAR和映像?

慢开发工作流/ Java反馈循环与Docker:我是否需要在每次更改后重建JAR和映像?
EN

Stack Overflow用户
提问于 2020-06-19 15:23:19
回答 1查看 214关注 0票数 2

我正在尝试修改一个应用程序,但与使用 Docker工作时相比,目前我的开发反馈循环要慢得多。与码头,我必须重建我的jar和图像后,每次更改(请参阅更详细的工作流程),造成缓慢的反馈循环。Docker世界中的Java开发人员为避免这种情况做了什么?

Dockerfile (供参考):

代码语言:javascript
运行
复制
FROM openjdk:8    
WORKDIR /usr/src/app  
COPY /target/my-project.jar .  
CMD ["java",  "-jar",  "my-project.jar"]

与 Docker (每次更改后3-5分钟的反馈时间):

在本地对我的Java codebase.

  • However进行修改#1中的更改是,我需要重新构建我的jar (使用maven包);codebase.

  • Rebuild映像需要3-4分钟。

  • 运行容器,并查看是否通过了更改。

没有Java的(每次更改后反馈只需几秒钟):

在我的Intellij运行配置上对运行的Java codebase.

  • Click进行本地更改,该配置立即运行我的主要方法,并查看更改是否通过.

据我所知,我的本地开发反馈循环(没有Docker)要快得多,因为Intellij能够缓存所有字节码(即"target/“目录中的类文件),只为更改的类(Es)重新构建类文件,跟踪我的类路径,并运行我的主要方法。它不需要重建整个jar,因此要快得多。我不知道怎么在Docker里复制这个。

UPDATE/ANSWER

我用以下方法解决了这个问题:

将我的项目的目标文件夹放到容器中的/usr/src/app/

  1. Bind-mounted,现在只调用我的Dockerfile中的主类,永远不会将JAR带到容器中。感谢@kutschkem.

  1. 在我的pom.xml中添加了maven依赖项插件,这样我的所有外部jar依赖项都可以保存到一个文件夹中(/usr/src/app/target/dependency jars/),然后我可以在下面的Dockerfile CMD中一次性将其添加到类路径中。从本文中得到了这样的想法:https://medium.com/holisticon-consultants/dont-build-fat-jars-for-docker-applications-6252a5571248.

新Dockerfile:

代码语言:javascript
运行
复制
FROM openjdk:8    
WORKDIR /usr/src/app/target
CMD ["java",  "-cp", "/usr/src/app/target/classes:/usr/src/app/target/dependency-jars/*",  "com.me.MainClass"]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-19 15:30:48

这里有两件事可以改进:

1)不要将jar文件复制到映像中,使用-v将容器中的文件夹作为卷挂载

2)如果建造罐子是个问题,那就不要!准备一个包含必要的类路径的java调用,并调用主类。不需要罐子。

当然,这是为了开发,但在功能上不应该有太大的差别。另外,是否有很好的理由测试坞容器中的类?如果要这样做的话,我将分离Java类和Docker映像的开发,并使用您描述的没有docker的工作流来测试我的Java代码,而且只有当我满意地转向映像开发时。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62473455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档