webpack热替换-Java代码热更新解决方案

2023-08-21 0 6,333 百度已收录

因为jvm来得正是时候webpack热替换,支持解释运行和过热代码编译,所以不需要像c/c++这样的纯静态语言,需要先编译再执行。 jvm系统的语言支持脚本执行。 只要编译成jvm能够识别的类,就可以执行。 执行过热(HotSpot)后会被编译成机器码,从而提高开发和运行效率。

代码热更新方案应用场景

webpack热替换-Java代码热更新解决方案

例如,提供一个与用户聊天的服务,一些用户对话的上下文信息存储在内存中(存储在NoSQL中需要额外的成本),如果你做了bugfix,但没有实现代码热更新webpack热替换,你就得停下来而此时重启服务,导致一段时间服务不可用,用户上下文信息丢失。

显示代码

webpack热替换-Java代码热更新解决方案

需要javac编译器或者其他支持编译java的编译器。以下是封装了Javac及其热更新代码的开源工具

乔尔

OpenHFT Java 运行时编译器

简要流程图如下

import net.openhft.compiler.CompilerUtils;
import org.joor.Reflect;
import java.util.concurrent.TimeUnit;
public class TestCompiler {
    // 单例,持有 volatile 修饰的 runnable, 需要其他线程(例如:监听脚本变更的线程)替换引用
    public static TestCompiler testCompiler = new TestCompiler();
    // 假设为业务代码
    public volatile Runnable bizRunnable = () -> System.out.println(this.getClass().getSimpleName());
    static String className = "com.eahau.example.compiler.TestCompilerRunnable";
    static String sourceCode = "package com.eahau.example.compiler;n" +
            "n" +
            "public class TestCompilerRunnable implements Runnable {n" +
            "    @Overriden" +
            "    public void run() {n" +
            "        TestCompiler.testCompiler.bizRunnable = () -> System.out.println(this.getClass().getSimpleName());n" +
            "    }n" +
            "}";
    /**
     * testJOOR.
     */
    static void testJoor() {
        Runnable runnable = Reflect.compile(className, sourceCode).create().get();
        runnable.run();
    }
    /**
     * test JRC: Java Runtime Compiler.
     */
    static void testJRC() throws Exception {
        Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, sourceCode);
        Object o = aClass.newInstance();
        if (o instanceof Runnable) {
            ((Runnable) o).run();
        }
    }
    static void bizStart() {
        // 模拟业务线程一直在处理业务
        new Thread(() -> {
            for (; ; ) {
                try {
                    testCompiler.bizRunnable.run();
                    TimeUnit.SECONDS.sleep(1L);
                } catch (InterruptedException ignore) {
                }
            }
        }).start();
    }
    public static void main(String[] args) throws Exception {
        bizStart();
        testJoor();
        testJRC();
    }
}

webpack热替换-Java代码热更新解决方案

import groovy.lang.GroovyClassLoader;
import java.util.concurrent.TimeUnit;
public class TestGroovy {
    public static TestGroovy testGroovy = new TestGroovy();
    public volatile Runnable bizRunnable = () -> System.out.println(this.getClass().getSimpleName());
    static void bizStart() {
        // 模拟业务线程一直在处理业务
        new Thread(() -> {
            for (; ; ) {
                try {
                    testGroovy.bizRunnable.run();
                    TimeUnit.SECONDS.sleep(1L);
                } catch (InterruptedException ignore) {
                }
            }
        }).start();
    }
    static void testGroovyCompiler() throws Exception {
        GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
        Class parsedClass = groovyClassLoader.parseClass(
                "package com.eahau.example.compilern" +
                        "n" +
                        "class TestGroovyRunnable implements Runnable {n" +
                        "    @Overriden" +
                        "    void run() {n" +
                        "        TestGroovy.testGroovy.bizRunnable = { System.out.println(this.getClass().simpleName) }n" +
                        "    }n" +
                        "}");
        Object o = parsedClass.newInstance();
        if (o instanceof Runnable) {
            ((Runnable) o).run();
        }
    }
    public static void main(String[] args) throws Exception {
        bizStart();
        testGroovyCompiler();
    }
}

写得比较简单,欢迎评论补充。 如有错误,请强调。

目录

发现问题了

使用脚手架通过vue命令初始化项目时,在cmd中输入vueinitwebpackvue_project,终端报错:

“vue”不被识别为内部或外部命令、可操作程序或批处理文件。

解决方案:

1、判断npm是否已经正确安装webpack不是内部或外部命令,在cmd中输入以下命令:

npm -v

可以查看当前npm版本号:

当显示版本号时,说明npm已经安装成功。

2、进入node.js安装目录,查看一级目录下是否有vue.cmd命令;

安装完vue后才能看到。 如果看不到命令​​,请返回控制台;

3.执行以下两条命令:

在cmd中输入以下命令:

npm install -g vue

之后,输入以下命令:

// 卸载
npm uninstall vue-cli -g
// 安装
npm install -g @vue/cli
// 或者 
cnpm install -g @vue/cli
// 或者
yarn global add @vue/cli

安装成功,看到了vue.cmd命令:

webpack热替换-Java代码热更新解决方案

4、安装完成后webpack不是内部或外部命令,通过以下任意命令检查vue的版本:

vue --version / vue –V

但是还是报错:‘vue’不是内部或外部命令。

环境变量也需要配置。

5、cmd中输入npmconfiglist查看目录,在prefix目录下找到对应的地址。

6、在“控制面板”上找到“系统和安全”,然后在“系统和安全”中找到“系统”。 找到系统界面后,在右侧边栏找到“高级系统设置”,点击进入:

7、点进去后,在中级选项卡上,找到“环境变量”按钮,点进去:

8、点击进去后,首先在“系统变量”部分选择路径行,然后点击下面的“编辑”按钮:

9、点击进去后,选择页面上的“新建”按钮:

10、在“新建”页面的最后一行,添加上面第5步查询到的前缀旁边的路径,然后点击“确定”,在出来的页面点击确定。 此时在cmd中输入以下命令:

vue --version / vue –V

可以看到,vue当前版本:

连接好后,就可以通过vue命令进行操作了。

总结

关于解决vue终端错误:不是内部或外部命令的这篇文章到此结束。 更多关于vue不是内部或外部命令的相关内容请搜索云海天教程之前的文章或者继续浏览下面的相关文章。 希望大家以后多多支持云海天教程!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 webpack webpack热替换-Java代码热更新解决方案 https://www.wkzy.net/game/128198.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务