首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有可能有一个基于"HotReload“接口的java环境吗?

有可能有一个基于"HotReload“接口的java环境吗?
EN

Stack Overflow用户
提问于 2020-02-04 10:22:25
回答 2查看 5.5K关注 0票数 3

我正在尝试使用maven构建一个java程序,以便在进行更改时运行在坞编写场景和热重加载上。我在原始libvm的基础上添加了trava-jdk libvm,并在适当的位置添加了hotswapagent库。当我运行java -version时,它给了我想要的东西。

代码语言:javascript
复制
Starting HotswapAgent '/usr/local/openjdk-11/lib/hotswap/hotswap-agent.jar'
HOTSWAP AGENT: 10:18:24.771 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent {1.4.0} - unlimited runtime class redefinition.
HOTSWAP AGENT: 10:18:24.992 INFO (org.hotswap.agent.config.PluginRegistry) - Discovered plugins: [JdkPlugin, Hotswapper, WatchResources, ClassInitPlugin, AnonymousClassPatch, Hibernate, Hibernate3JPA, Hibernate3, Spring, Jersey1, Jersey2, Jetty, Tomcat, ZK, Logback, Log4j2, MyFaces, Mojarra, Omnifaces, ELResolver, WildFlyELResolver, OsgiEquinox, Owb, Proxy, WebObjects, Weld, JBossModules, ResteasyRegistry, Deltaspike, GlassFish, Vaadin, Wicket, CxfJAXRS, FreeMarker, Undertow, MyBatis]
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment 18.9 (build 11.0.5+10)
Dynamic Code Evolution 64-Bit Server VM 18.9 (build 11.0.5+5-202001261315, mixed mode)

要实现这一点,我的dockerfile如下所示

代码语言:javascript
复制
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测试,并且我希望能够快速地迭代新的测试或失败的测试,而不需要重新编译或重新启动容器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-04 12:57:42

我没有与这种具体的热浪剂合作的经验,但总的来说,我要回答你的问题:

  1. 在构建docker映像时,您最终应该运行自己的应用程序(通过maven、使用java -jar或以任何其他方式),因此,当您启动应用程序进程时,您应该让应用程序为远程调试做好准备:
代码语言:javascript
复制
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999
  1. 您应该在docker中公开一个调试端口,以便IDE将连接到主机上的该端口,并将其路由到港口容器中的端口9999。
  2. 确保应用程序正在运行。
  3. 在IDE创建“远程调试配置”中,在IntelliJ: Run/Debug配置中,->远程->创建新配置,并指定在步骤2期间创建的主机和公开端口。
  4. 如果您在某个源文件中做了一些更改,在连接到远程调试会话时右击并编译它。
  5. 如果可以完成更改,它将在此时使用hotswap并将新的字节码“上载”到停靠程序内部的远程进程,在这种情况下,它将应用这些更改而不需要重新加载。

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

票数 6
EN

Stack Overflow用户

发布于 2020-02-06 14:40:00

有一个项目HotswapDocklands专门用于在Docker中运行HotswapAgent+dcevm。它使用/extra_class_path目录到Docker目录的映射.然后,对extra_class_path中的任何文件所做的所有修改都是使用extraClassPath对dcevm进行“刷新”的。要附加调试器,必须使用jdwp运行dcevm,并从Docker公开调试器端口。

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

https://stackoverflow.com/questions/60055279

复制
相关文章

相似问题

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