我有一个在春季启动版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
有可能解决这个问题吗?
答案 0 :(得分:0)
WAR部署在许多方面与通过IDE中的Spring Boot运行配置运行应用程序不同。您可以尝试在运行配置中复制Gradle / Maven所做的所有打包操作,例如通过IntelliJ的工件。
答案 1 :(得分:0)
不确定直接从IDE启动应用程序时TLD文件的确切位置,但是可以肯定它们不在JSP规范指定的位置之一,默认情况下TaglibFactory
遵循规范。但是您可以通过调用setMetaInfTldSources
或setClasspathTlds
来配置它。因此,您必须调整Spring使用的TaglibFactory
;请参见Custom EL functions won't be loaded because no ObjectWarpper was specified中的示例。
顺便说一句,FreemarkerServlet
所做的(Spring AFAIR未使用)是您可以设置Java系统属性org.freemarker.jsp.classpathTlds
和org.freemarker.jsp.metaInfTldSources
来做到这一点,这些调整完全是在IDE启动配置中进行的(例如,您将-Dorg.freemarker.jsp.metaInfTldSources=classpath
添加到Java选项中)。这是一个您可以轻松地重新实现的想法。