关于 undertow.resourcePath 问题咨询

文档中说 PathKit.getWebRootPath() 将指向 undertow.resourcePath 配置中的第一个有效目录,这个目录是在什么哪个环节给到PathKit.getWebRootPath() 的呢,今天追了下源码没找到地方,想请教下各位大佬。

image.png


另外,我在中进行了几次输出,时间点在 onstart 方法前后都有,但是和 onstart 方法输出的内容都不一样,添加的输出的都没有配置中的信息,但是 onstart 方法中就有,如下图:

image.png

评论区

JFinal

2020-06-05 00:40

在使用 jfinal undertow 开发时,是通过 jfinal undertow 项目中的 UndertowKit. doConfigJFinalPathKit(...) 方法使用反射的方式,调用了 PathKit.setWebRootPath(...) 方法,向其注入了 undertow.resourcePath 中第一个有效的目录

代码:
https://gitee.com/jfinal/jfinal-undertow/blob/master/src/main/java/com/jfinal/server/undertow/

JFinal

2020-06-05 00:41

至于你在不同地方输出 PathKit.getWebRootPath() 的值不同的问题,注意是不是时机不同,输出的时机要看是否是在 UndertowKit. doConfigJFinalPathKit(...) 之前还是之后

永字诀

2020-06-05 20:42

@JFinal 非常感谢波总的耐心回复,但是还得追问一句,我看您说的这个地方了,他的上一步是先判断是否是部署模式,只有部署模式才进行哪个UndertowKit.configJFinalPathKit(config);我把这个代码贴出来,您再回忆回忆
/**
* 为 com.jfinal.kit.PathKit 注入值,以便支持 jfinal-undertow 的部署方式
* 该配置要兼顾开发与部署两种场景
*/
protected void configJFinalPathKit() {
// 部署模式下才需要为 jfinal 的 PathKit 注入值
if (UndertowKit.isDeployMode()) {
UndertowKit.configJFinalPathKit(config);
return ;
}
}

JFinal

2020-06-05 22:00

@永字诀 UndertowKit.configJFinalPathKit(config) 只有在部署环境下才会被调用,因为非部署环境下, PathKit 中的 webRootPath 可以被正确获取

在 JFinal.initPathKit() 中有这样几行代码:
private void initPathKit() {
String path = servletContext.getRealPath("/");
PathKit.setWebRootPath(path);
}

非部署环境下 servletContext.getRealPath("/") 可以获取到正确的值。 部署环境下,这里获取的值应该是 null 值

JFinal

2020-06-05 22:00

在 PathKit.setWebRootPath(...) 中设置一个断点可以很容易看到这个执行过程

永字诀

2020-06-05 22:06

@JFinal 再次感谢波总,您说的非部署模式下“ PathKit 中的 webRootPath 可以被正确获取”这个过程我可以理解。但是非部署模式下我在 undertow.txt 中设置 undertow.resourcePath = G:/, classpath:static 后,Engine.addSharedFunction 开始在 G:/ 目录下开始寻找文件了,我是没有理解非部署模式下 undertow.resourcePath = G:/, classpath:static 怎么给到 webRootPath 的?

JFinal

2020-06-05 22:37

@永字诀 这个就是关键了,这是因为 JFinal.initPathKit() 中的 servletContext.getRealPath("/"); 获取到的值,取决于 undertow.resourcePath

你配置不同的 undertow.resourcePath 值,然后在 JFinal.initPathKit() 中打个断点,就能看到值在不停的变化

当然,前提是你配置的 undertow.resourcePath 所指向的目录一定要是真实存在的

试一下以后再来回复一下

永字诀

2020-06-06 22:17

@JFinal 已测试,反馈如下:
1、JFinal.initPathKit() 中的 servletContext.getRealPath("/"); 获取到的值,取决于 undertow.resourcePath,使用的是第一个有效目录;
2、根据代码观察应该是在 UndertowServer.configUndertow 中使用 di.setResourceManager(config.getResourceManager()); 逻辑将 undertow.resourcePath 和 servletContext 做了关联;
3、分别在 UndertowServer.start、UndertowServer.doStart、MyConfig.onStart、MyController 方法中输出了多次 PathKit.getWebRootPath,控制台显示的输出顺序是在 MyConfig.onStart 方法前后都有输出,但是 UndertowServer.start、UndertowServer.doStart 都不是配置中的,MyConfig.onStart、MyController 输出的是配置信息,这应该就是波总说的时机问题吧,但是能力有限暂时不能很好地理解这个时机。

JFinal

2020-06-06 22:28

@永字诀 只要证实下面这个就可以了:
JFinal.initPathKit() 中的 servletContext.getRealPath("/"); 获取到的值,取决于 undertow.resourcePath,使用的是第一个有效目录

其它的不是重点

永字诀

2020-06-07 16:40

@JFinal 是的,感谢波总,手动抱拳。