undertow下PathKit的路径获取不一致

这是生产环境:

Starting JFinal 4.0 -> http://0.0.0.0:80

Info: jfinal-undertow 1.6, undertow 2.0.19.Final, jvm 1.8.0_211

getRootClassPath===================D:\JFinal\jfinal-club\target\classes

getWebRootPath=====================D:\JFinal\jfinal-club\src\main\webapp

getPath(clazz)=====================D:\JFinal\jfinal-club\target\classes\com\jfinal\club\common

getPath(object)====================java/lang

Starting Complete in 4.1 seconds. Welcome To The JFinal World (^_^)

这是mvn打包后:

Starting JFinal 4.0 -> http://0.0.0.0:80

Info: jfinal-undertow 1.6, undertow 2.0.19.Final, jvm 1.8.0_211

getRootClassPath===================D:\JFinal\jfinal-club\target\jfinal-club-release\jfinal-club\config

getWebRootPath=====================D:\JFinal\jfinal-club\target\jfinal-club-release\jfinal-club\webapp

getPath(clazz)=====================D:\JFinal\jfinal-club\target\jfinal-club-release\jfinal-club\file:\D:\JFinal\jfinal-club\target\jfinal-club-release\jfinal-club\lib\jfinal-club-4.0.jar!\com\jfinal\club\common

getPath(object)====================java/lang

Starting Complete in 2.4 seconds. Welcome To The JFinal World (^_^)


之前一个项目用到了相关功能,在切换到undertow时,出现了一些莫名的问题

评论区

杜福忠

2019-05-26 01:00

原因已经写在了jfinal-undertow里面:(我拷贝过来:)
// 部署模式下才需要为 jfinal 的 PathKit 注入值
/**
* 1:先通过 UndertowKit.getClassPathDirs() 从 System.getProperty("java.class.path")
* 中获取 class path 值,开发阶段将获取到正确的 class path 值,如: .../target/classes
*
*
* 2:如果项目打成 jar 包并部署将无法正确获取 class path 值,则使用 Class.getProtectionDomain()
* 的方式来获取
*
*
* 3:如果 targetClass 处在 jar 包之中,则 targetClass.getProtectionDomain() 方式获取到的是
* targetClass 所在的 jar 文件的全路径名,例如:
* .../maven_repo/com/.../xxx.jar
* 注意该值带有文件名
*
* 如果 targetClass 不处在 jar 包之中,将获取 target 所在的目录的全路径,例如:
* .../target/classes
* 注意该值仅仅是路径,不带文件名
*
*
* 4:不能跳过第一步直接使用 Class.getProtectionDomain() 方案,因为对于 maven 项目来说
* 该方案得到的路径通常是指向本地 maven 库中的一个路径,因为 maven 项目的多数 jar 依赖
* 都指向 maven 库
*
* 而打包部署后的项目,其中的依赖要么在 fatjar 之中,要么在项目的 lib 子目录下,对于传统
* java web 项目在 WEB-INF/lib 之下。这三种情况才有了间接定位 root class path 的可能
*/
在520行:
https://gitee.com/jfinal/jfinal-undertow/blob/master/src/main/java/com/jfinal/server/undertow/UndertowServer.java

JFinal

2019-05-26 10:25

打包以后,路径当然就变了, 否则怎么跑得起来

无论是打包前还是打包后, web root 始终是 webapp 之下,打包后再也没有 src/main 这种目录了,不变怎么行

热门反馈

扫码入社