Java检测到代码已被热交换

时间:2018-01-10 00:23:23

标签: java intellij-idea hotswapagent

奇怪的问题 - 但我想知道我是如何写代码的,基本上说是#34;自从我上次检查以来,任何课程都被intellij热切换了#34;

为什么?

由于恶劣的历史原因 - springcontext启动需要2-3分钟,这意味着如果你只想进行一次测试,那就是2-3分钟的等待时间。如果你是一个TDD人,想要写一点,跑,写一点,跑 - 它是不可行的。加快springcontext加载显然是理想的,但超出了我的时间,因为它一团糟 - 我想的只是做一个无限循环的junit测试:

while true
    try {run the actual test;show success} catch {show error}
    wait until code is hot swapped

这样,很多时候,有人可以只写一些代码,按下构建键 - 它会立即再次运行而不重新加载上下文 - 延迟2-3分钟到不到一秒钟。

1 个答案:

答案 0 :(得分:0)

查看HotswapAgent,Java无限运行时类和资源重新定义。

下载dcevm和最新hotswap-agent-core.jar,然后使用java --javaagent:c:\java\hotswap-agent-core.jar YourApp运行您的应用。

添加HotswapAgent依赖项:

    <dependency>
        <groupId>org.hotswapagent</groupId>
        <artifactId>hotswap-agent-core</artifactId>
        <version>1.3.0</version>
        <scope>provided</scope>
    </dependency>

您还需要Hotswap Agent插件来重新加载Spring和其他bean /缓存:

        <dependency>
            <groupId>org.hotswapagent</groupId>
            <artifactId>hotswap-agent-plugins</artifactId>
            <version>1.3.0</version>
            <type>pom</type>
        </dependency>

编写您的插件类:

    @Plugin(name = "TriggerHotswapPlugin")
    public class TriggerHotswapPlugin {

        @OnClassLoadEvent(classNameRegexp = ".*", events = LoadEvent.REDEFINE)
        public static void onAnyReload() {
            .. synchronization mechanism with your class .. ;
        }

        @OnResourceFileEvent(path = "/", filter = ".*.resource")
        public void onResourceChanged() {
            .. synchronization mechanism with your class .. ;
        }
    }

创建hotswap-agent.properties

    pluginPackages=your.plugin.package

作为替代方案,您可以创建简单的javaagent来触发hotswap,但是无论如何都需要java classess的完全热交换,为什么不编写自定义hotswap代理插件。