在undertow中配置多个静态目录,使用demo打包运行出错

# 打成 fatjar 部署的项目开启下面的配置
undertow.resourcePath= src/main/webapp, classpath:webapp, E:/demo/jfinal/jfinal-3.8_demo_for_maven/jfinal_demo_for_maven/static

上门在逗号后面多加了一个静态资源目录,打包

mvn clean package

运行提示出错

Snipaste_2019-05-07_17-08-47.png

这个是怎么回事,直接在idea中调试运行没有问题,但是打包后运行就出错?


me.setToClassPathSourceFactory();
me.setBaseTemplatePath("webapp");

me.addSharedFunction("/common/_layout.html");
me.addSharedFunction("/common/_paginate.html");

这样修改过之后,还是报错


通过idea进行复制和移动到resource目录下依然会出错,但是从文件管理里面复制移动 ,运行就不报错,很奇怪

评论区

JFinal

2019-05-07 17:28

你这个是去的模板时候出的错误,是 enjoy 引擎找不到,需要配置:
configEngine(Engien me) {
engine.setToClassPathFactory();
eninge.setBaseTemplatePath("webapp");
}

将 webapp目录整体挪到 src/main/resources 目录下面去

localhost8080

2019-05-07 17:51

@JFinal 修改之后运行报这个错误
java.lang.IllegalArgumentException: File not found in CLASSPATH or JAR : "webapp/common/_layout.html"
at com.jfinal.template.source.ClassPathSource.(ClassPathSource.java:67)
at com.jfinal.template.source.ClassPathSourceFactory.getSource(ClassPathSourceFactory.java:29)
at com.jfinal.template.EngineConfig.addSharedFunction(EngineConfig.java:88)
at com.jfinal.template.Engine.addSharedFunction(Engine.java:246)
at com.demo.common.DemoConfig.configEngine(DemoConfig.java:79)
at com.jfinal.core.Config.configJFinal(Config.java:57)
at com.jfinal.core.JFinal.init(JFinal.java:61)
at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:63)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)
at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:589)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:554)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:596)
at com.jfinal.server.undertow.UndertowServer.configHttp(UndertowServer.java:284)
at com.jfinal.server.undertow.UndertowServer.doStart(UndertowServer.java:262)
at com.jfinal.server.undertow.UndertowServer.start(UndertowServer.java:159)
at com.jfinal.server.undertow.UndertowServer.start(UndertowServer.java:84)
at com.demo.common.DemoConfig.main(DemoConfig.java:34)

localhost8080

2019-05-07 18:29

@JFinal 通过idea进行复制和移动到resource目录下依然会出错,但是从文件管理里面复制移动 ,运行就不报错,很奇怪

JFinal

2019-05-07 19:51

@localhost8080 undertow.resourcePath 是配置 undertow 访问静态资源的方式,以 classpath: 打头是从 class path 和 jar 包中读静态资源

而 engine.setToClassPathFactory() 是指示 enjoy 模板引擎从 class path 和 jar 包中读模板文件

注意区分上面两者,它们两者完全无关,所以配置的时候不要将两者混在一起考虑

另一个知识是:将资源放入 src/main/resources 下面,会被 eclipse 、IDEA 自动 copy 到 class path 下面,也就是 target/classes 下面

所以,你可以将 src/main/resources 也当成是 class path来使用,进而 可以配置:
engine.setToClassPathFactory();
engine.setBaseTemplatePath(basePath);
其中 basePath 是资源文件在 src/main/resources 下面的子目录,一般是 static 或者 webapp,要根据实际情况去配置

JFinal

2019-05-07 19:52

最后,复制到 src/main/resources 不生效的问题,重新编译一下整个项目即可,编辑完成后检查 target/classes 下面这些文件被自动 copy 过去了没有

localhost8080

2019-05-08 08:37

@JFinal 感谢ths,重新编译下确实能解决问题了,从idea中copy和从文件管理中直接copy一样了

localhost8080

2019-05-08 09:05

@JFinal
当这个
engine.setToClassPathFactory();
engine.setBaseTemplatePath(basePath);
修改过之后,controller对应的视图路径是不是也改变了?会出现500,
java.lang.IllegalArgumentException: File not found in CLASSPATH or JAR : "static/index/index.html"

JFinal

2019-05-08 09:15

@localhost8080
很明显是 target/classes/static/index/index.html 找不到,如果是打包后的,则在 jar 包中找不到 static/index/index.html

仔细看文档,有关 Engine 的从 class path 加载模板部分

一定要注意下面的两个配置与 undertow.resourcePath 配置完全无关:
engine.setToClassPathFactory();
engine.setBaseTemplatePath(basePath);

localhost8080

2019-05-08 10:00

@JFinal
这个官网demo项目,我就在undertow.resourcePath后面添加了一个静态资源目录,然后其他都没动,在idea中可以运行,mvn 打包后,运行不起来,提示,在我添加的那个静态资源目录下缺少引擎模板文件,但是这个undertow.resourcePath不是可以随意添加的吗?怎么会影响到webapp里面的内容呢,不应该是webapp和我自定义添加的目录都是静态资源目录吗?哪个里面有需要的资源从哪里读取

localhost8080

2019-05-08 10:11

@JFinal 我知道了需要在undertow.resourcePath=src/main/webapp,webapp后面再添加一个目录即可

麦田的守望者

2020-09-14 00:10

@localhost8080 感谢分享,捣鼓了很久。在idea中运行正常,打包后项目不能访问了,去掉图片目录就可以访问。最后加上在图片目录前加上webapp就可以了。

热门反馈

扫码入社