有可能有一个基于docker的java环境吗?

有可能有一个基于docker的java环境吗?,java,maven,docker,intellij-idea,dcevm,Java,Maven,Docker,Intellij Idea,Dcevm,我正在尝试使用maven构建一个java程序,在docker compose场景中运行,并在进行更改时进行热重新加载。 我在原始libvm的基础上添加了libvm,并在适当的位置添加了hotswapagent库。当我运行java版本时,它提供了我想要的东西 正在启动HotswapAgent“/usr/local/openjdk-11/lib/hotswap/hotswap agent.jar” 热交换代理:10:18:24.771 INFO org.HOTSWAP.AGENT.HotswapAg

我正在尝试使用maven构建一个java程序,在docker compose场景中运行,并在进行更改时进行热重新加载。 我在原始libvm的基础上添加了libvm,并在适当的位置添加了hotswapagent库。当我运行java版本时,它提供了我想要的东西

正在启动HotswapAgent“/usr/local/openjdk-11/lib/hotswap/hotswap agent.jar” 热交换代理:10:18:24.771 INFO org.HOTSWAP.AGENT.HotswapAgent-加载热交换代理{1.4.0}-无限运行时类重新定义。 热插拔代理:10:18:24.992 INFO org.HOTSWAP.AGENT.config.PluginRegistry-发现的插件:[JdkPlugin、Hotswapper、WatchResources、ClassInitPlugin、AnonymousClassPatch、Hibernate、Hibernate3JPA、Hibernate3、Spring、Jersey1、Jersey2、Jetty、Tomcat、ZK、Logback、Log4j2、MyFaces、Mojara、Omnifaces、ELResolver、WildFlyELResolver、OsgiEquinox、Owb、代理、WebObjects、Weld、JBossModules、ResteasyRegistry、Deltaspike、GlassFish、Vaadin、Wicket、 CxfJAXRS、FreeMarker、底拖、MyBatis] openjdk版本11.0.5 2019-10-15 OpenJDK运行时环境18.9版本11.0.5+10 动态代码演化64位服务器VM 18.9版本11.0.5+5-202001261315,混合模式 我要实现的dockerfile如下所示

FROM maven:latest

WORKDIR /tmp
RUN wget https://github.com/TravaOpenJDK/trava-jdk-11-dcevm/releases/download/dcevm-11.0.5%2B5/java11-openjdk-dcevm-linux.tar.gz
RUN tar -xvf  java11-openjdk-dcevm-linux.tar.gz
RUN mv dcevm-11.0.5+5 /dcevm
WORKDIR /dcevm
RUN rm /usr/local/openjdk-11/lib/server/libjvm.so
RUN cp /dcevm/lib/server/libjvm.so /usr/local/openjdk-11/lib/server/
RUN cp -r /dcevm/lib/hotswap /usr/local/openjdk-11/lib/
现在,我发现自己对如何在Ide上应用热加载并正确运行代码有点迷茫


如果您想知道为什么我需要这样一个黑客,我有一个IoT环境,它有E2E测试,我希望能够快速迭代新的测试或失败的测试,而无需重新编译或重新启动容器。

我没有使用这个具体的热交换代理的经验,但通常可以回答您的问题:

在构建docker映像时,您应该通过maven、java-jar或任何其他方式运行自己的应用程序。因此,在启动应用程序进程时,您应该让应用程序准备好进行远程调试: 您应该在docker中公开一个调试端口,以便IDE将连接到主机上的该端口,并将其路由到docker容器中的端口9999

确保应用程序正在运行

在IDE创建远程调试配置中,在IntelliJ:Run/Debug Configurations->Remote->create new configuration中,指定在步骤2中创建的主机和公开端口。您应该能够连接并在与IDE交互的代码中放置断点

若您在某些源文件中做了一些更改,请在连接到远程调试会话时右键单击并编译它

如果可以进行更改,它将在此时使用热交换,并将新字节码上载到docker内部的远程进程(在这种情况下),并将在不重新加载的情况下应用此更改


默认情况下,JVM已经提供了热点功能,但我认为这个库应该提供更灵活/更强大的选项。

我没有使用这个具体的热交换代理的经验,但一般来说,要回答您的问题:

在构建docker映像时,您应该通过maven、java-jar或任何其他方式运行自己的应用程序。因此,在启动应用程序进程时,您应该让应用程序准备好进行远程调试: 您应该在docker中公开一个调试端口,以便IDE将连接到主机上的该端口,并将其路由到docker容器中的端口9999

确保应用程序正在运行

在IDE创建远程调试配置中,在IntelliJ:Run/Debug Configurations->Remote->create new configuration中,指定在步骤2中创建的主机和公开端口。您应该能够连接并在与IDE交互的代码中放置断点

若您在某些源文件中做了一些更改,请在连接到远程调试会话时右键单击并编译它

如果可以进行更改,它将在此时使用热交换,并将新字节码上载到docker内部的远程进程(在这种情况下),并将在不重新加载的情况下应用此更改

默认情况下,JVM已经提供了热点功能,但我认为这个库应该提供更灵活/强大的选项。

有一个项目专门用于在Docker中运行HotswapAgent+dcevm。它使用在Docker/extra_class_路径目录到Docker外目录的映射。然后在extra_c中的任何文件上进行所有修改lass_路径被热封为dcevm。要连接调试器,您必须使用jdwp运行dcevm,并从Docker公开调试器端口。

有一个项目专门用于在Docker中运行HotswapAgent+dcevm。它使用in-Docker/extra_class_路径目录到out-Docker目录的映射。然后对extra_cl中的任何文件进行所有修改ass_路径被热封到dcevm。要连接调试器,您必须使用jdwp运行dcevm,并从Docker公开调试器端口。


我要指出的唯一一点是,因为我在docker上运行它,所以我需要做-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9999。我要指出的唯一一点是,因为我在docker上运行它,所以我需要做-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9999
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999