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

时间:2018-08-01 17:24:34

标签: java spring spring-boot intellij-idea 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模板中,我包括标签库,例如:

<#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

有可能解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

WAR部署在许多方面与通过IDE中的Spring Boot运行配置运行应用程序不同。您可以尝试在运行配置中复制Gradle / Maven所做的所有打包操作,例如通过IntelliJ的工件。

答案 1 :(得分:0)

不确定直接从IDE启动应用程序时TLD文件的确切位置,但是可以肯定它们不在JSP规范指定的位置之一,默认情况下TaglibFactory遵循规范。但是您可以通过调用setMetaInfTldSourcessetClasspathTlds来配置它。因此,您必须调整Spring使用的TaglibFactory;请参见Custom EL functions won't be loaded because no ObjectWarpper was specified中的示例。

顺便说一句,FreemarkerServlet所做的(Spring AFAIR未使用)是您可以设置Java系统属性org.freemarker.jsp.classpathTldsorg.freemarker.jsp.metaInfTldSources来做到这一点,这些调整完全是在IDE启动配置中进行的(例如,您将-Dorg.freemarker.jsp.metaInfTldSources=classpath添加到Java选项中)。这是一个您可以轻松地重新实现的想法。