0

奇怪的问题-但我想知道如何编写代码以基本上说“自从我上次检查以来,intellij 是否对任何类进行了热交换”

为什么?

由于邪恶的历史原因 - 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 分钟的延迟降低到小于第二。

4

1 回答 1

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,为什么不编写自定义 hotswap 代理插件。

于 2018-05-16T18:36:35.453 回答