切换至 uundertow 1.3 启动异常

有这样三个类

//配置类
public class SystemConfig extends JFinalConfig {

    @Override
    public void configConstant(Constants me) {
        LuceneConst.INDEX_DIR = PropKit.get("data.lucene.dir");
    }
}

//常量类
public class LuceneConst {
    public static String INDEX_DIR;
}

//管理类
public enum DirectoryManager {

    INSTANCE;

    DirectoryManager() {
     Directory directory = null;
        try {
            directory = FSDirectory.open(Paths.get(LuceneConst.INDEX_DIR));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


原来在tomcat下启动正常
但是切换到undertow之后, LuceneConst.INDEX_DIR = null
在IDEA调试的时候,在SystemConfig中,LuceneConst.INDEX_DIR 已经被赋值,
但是当代码走到 DirectoryManager中的时候,INDEX_DIR 却没有值。
求指教。


评论区

JFinal

2018-12-14 12:36

配置 undertow.hotSwapClassPrefix=...
将需要热加载的类的前缀包含进来,如果有多个前缀,用逗号分隔

jfinal 默认已被添加, 例如:
undertow.hotSwapClassPrefix=com.jfinal.

看一下 HotSwapResover.java 这个类

badouyuren

2018-12-17 21:39

@JFinal dev 改为false 之后正常了

JFinal

2018-12-17 23:43

@badouyuren 改 devMode 为 false 以后无法支持热加载,建议还要要通过 undertow.hotSwapClassPrefix 配置来搞定,记得一定要再反馈给我,Lucene 场景的热加载支持目前只有你这里有

badouyuren

2018-12-19 18:02

@JFinal 我的很多类里面都是这种模式,lucene的manage只是其中一个。感觉和这个manager使用了enum 实现单例模式,造成的热加载失败

JFinal

2018-12-19 23:47

@badouyuren 有多少都没关系,单例模式也没关系,使用 undertow.hotSwapClassPrefix 继续添加就好

JFinal

2019-02-24 15:32

jfinal undertow 1.5 这版本针对很多小问题做了改进,升级了没?

badouyuren

2019-03-08 10:20

@JFinal 还没呢,我这异常数据比较多,最近没时间切换

JFinal

2019-03-08 11:45

@badouyuren 切换后记得回来分享一下,新版本去除了这些日志

badouyuren

2020-08-12 16:15

@JFinal 今天升级到最新的undertow之后,依旧有这个问题。不过看了这篇 https://jfinal.com/share/2226 分享之后解决了。如果不添加为SystemClass 就会导致静态变量最终为null, 两个时空的类加载 静态变量分别初始化 无法共享。

JFinal

2020-08-12 16:44

@badouyuren 原来是这个原因,搞定就好

那些报异常的类是不是打包在了 jar 之中才出的这个问题?

badouyuren

2020-08-12 17:04

@JFinal devMode = true 的时候,类似于我上面贴出来的代码,在一个enum类的构造方法中调用静态变量,就会null了。并且,我发现,在enum的构造方法中 调用
model 的dao (public static final SystemDefenceType dao = new SystemDefenceType().dao();)也是null .

JFinal

2020-08-12 18:06

@badouyuren 我觉得与你的使用方式可能有关,例如是不是在启动前就调用了 dao

UndertowServer 启动前与启动后,是两个世界,因为 ClassLoader 不同

热门反馈

扫码入社