簡體   English   中英

Intellij Idea Spring Boot Launcher:Taglibs不在Freemarker中加載

[英]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遵循規范。 但是您可以通過調用setMetaInfTldSourcessetClasspathTlds來進行其他配置。 因此,您必須調整Spring使用的TaglibFactory 請參見Custom EL函數中的示例, 因為未指定ObjectWarpper,因此不會加載

順便說一句, FreemarkerServlet所做的事情(Spring AFAIR不使用)是您可以設置org.freemarker.jsp.classpathTldsorg.freemarker.jsp.metaInfTldSources Java系統屬性來執行此操作,以便您可以完全進行這些調整在IDE啟動配置中(例如,將-Dorg.freemarker.jsp.metaInfTldSources=classpath添加到Java選項)。 這是一個您可以輕松地重新實現的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM