Intellij idea spring boot 启动器:taglibs 不会在

我有在 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

有没有可能解决这个问题?


ITMISS
浏览 235回答 2
2回答

慕勒3428872

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

慕盖茨4494581

不确定直接从 IDE 启动应用程序时 TLD 文件的确切位置,但肯定它们不在 JSP 规范指定的位置之一,并且默认情况下TaglibFactory遵循规范。但是您可以通过调用setMetaInfTldSources或来配置它setClasspathTlds。所以你必须调整TaglibFactorySpring 使用的;请参阅不会加载自定义 EL 函数中的示例,因为未指定 ObjectWarpper。顺便说一句,什么FreemarkerServlet(Spring AFAIR 不使用)是您可以设置org.freemarker.jsp.classpathTlds和org.freemarker.jsp.metaInfTldSourcesJava 系统属性来执行此操作,以便您可以纯粹在 IDE 启动配置中进行这些调整(例如,您添加-Dorg.freemarker.jsp.metaInfTldSources=classpath到 Java 选项)。这是一个您可以轻松重新实现的想法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java