[英]Intellij idea spring boot launcher: taglibs doesn't load in freemarker
我有一個在春季啟動2.0.4上啟動的Web應用程序。 依賴關系還存在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模板中,我包括taglib,例如:
<#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中運行時,這些標記庫無法正確啟動。 如果我在Tomcat中部署war或在沒有intellij的情況下直接運行(如java -jar web.war),一切都很好,將加載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
有可能解決這個問題嗎?
WAR部署在許多方面與通過IDE中的Spring Boot運行配置運行應用程序不同。 您可以嘗試通過運行IntelliJ的工件來復制Gradle / Maven在運行配置中所做的所有包裝。
不知道直接從IDE啟動應用程序時TLD文件的確切位置,但是可以肯定它們不在JSP規范指定的位置之一,並且默認情況下TaglibFactory
遵循規范。 但是您可以通過調用setMetaInfTldSources
或setClasspathTlds
來進行其他配置。 因此,您必須調整Spring使用的TaglibFactory
。 請參見Custom EL函數中的示例, 因為未指定ObjectWarpper,因此不會加載 。
順便說一句, FreemarkerServlet
所做的事情(Spring AFAIR不使用)是您可以設置org.freemarker.jsp.classpathTlds
和org.freemarker.jsp.metaInfTldSources
Java系統屬性來執行此操作,以便您可以完全進行這些調整在IDE啟動配置中(例如,將-Dorg.freemarker.jsp.metaInfTldSources=classpath
添加到Java選項)。 這是一個您可以輕松地重新實現的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.