我有在 spring boot 2.0.4 上启动的网络应用程序。依赖项也存在 taglibs-standard-impl 1.2.5。我的项目结构如下。web/├── src ├── main │ ├── java │ │ │ ├── resources │ │ ├── i18n │ │ ├── static │ │ └── templates │ └── webapp │ ├── META-INF │ └── WEB-INF └── test └── java在 WEB-INF 中,我有一个带有一个自定义 tld 的文件夹 tld。我的主要课程:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})public class WebMain extends SpringBootServletInitializer implements WebApplicationInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(WebMain.class); } public static void main(String[] args) { SpringApplication.run(WebMain.class, args); }}问题如下,基本上影响开发时间。在我的主要 freemarker 模板中,我包含了标签库,例如:<#assign form=JspTaglibs["http://www.springframework.org/tags/form"]/><#assign spring=JspTaglibs["http://www.springframework.org/tags"]/><#assign common = JspTaglibs["/WEB-INF/tld/common.tld"]>问题是,通过 spring boot 启动器在 intellij IDEA 中运行时,这些 taglib 无法正确启动。如果我在Tomcat中部署war或者像java -jar web.war这样没有intellij直接运行,一切都很好,taglibs被加载。我在调试的时候了解到,问题是如果使用IntellijIdea的spring boot启动器,在TaglibFactory类中找不到WEB-INF文件夹。在其中,任何通过引起的调用servletContext.getResourcePaths (path);其中路径以“/WEB-INF”开头,始终返回null,因此无法将任何内容加载到tldLocations。Intellij 有 4 种类型的缩短命令行:无、JAR 清单、类路径文件和用户本地默认值:无。我试图全部使用它们,但一切都还保留着。例如,JAR 清单生成这样的命令:/usr/lib/jvm/java-8-oracle/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:40359,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -javaagent:/home/birthright/IDEA/lib/rt/debugger-agent.jar=file:/tmp/capture128.props -Dfile.encoding=UTF-8 -classpath /tmp/classpath1030746450.jar com.birthright.WebMain有没有可能解决这个问题?
2 回答
![?](http://img1.sycdn.imooc.com/545863aa00014aa802200220-100-100.jpg)
慕勒3428872
TA贡献1848条经验 获得超6个赞
WAR 部署在许多方面与通过 IDE 内的 Spring Boot 运行配置运行应用程序不同。您可以尝试复制 Gradle/Maven 在您的运行配置中所做的所有打包,例如通过 IntelliJ 的工件。
![?](http://img1.sycdn.imooc.com/533e4d5b0001d57502200203-100-100.jpg)
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
不确定直接从 IDE 启动应用程序时 TLD 文件的确切位置,但肯定它们不在 JSP 规范指定的位置之一,并且默认情况下TaglibFactory
遵循规范。但是您可以通过调用setMetaInfTldSources
或来配置它setClasspathTlds
。所以你必须调整TaglibFactory
Spring 使用的;请参阅不会加载自定义 EL 函数中的示例,因为未指定 ObjectWarpper。
顺便说一句,什么FreemarkerServlet
(Spring AFAIR 不使用)是您可以设置org.freemarker.jsp.classpathTlds
和org.freemarker.jsp.metaInfTldSources
Java 系统属性来执行此操作,以便您可以纯粹在 IDE 启动配置中进行这些调整(例如,您添加-Dorg.freemarker.jsp.metaInfTldSources=classpath
到 Java 选项)。这是一个您可以轻松重新实现的想法。
添加回答
举报
0/150
提交
取消