为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2021-06-10 18:17:13
我有在 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有没有可能解决这个问题?
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-06-23
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

不确定直接从 IDE 启动应用程序时 TLD 文件的确切位置,但肯定它们不在 JSP 规范指定的位置之一,并且默认情况下TaglibFactory遵循规范。但是您可以通过调用setMetaInfTldSources或来配置它setClasspathTlds。所以你必须调整TaglibFactorySpring 使用的;请参阅不会加载自定义 EL 函数中的示例,因为未指定 ObjectWarpper

顺便说一句,什么FreemarkerServlet(Spring AFAIR 不使用)是您可以设置org.freemarker.jsp.classpathTldsorg.freemarker.jsp.metaInfTldSourcesJava 系统属性来执行此操作,以便您可以纯粹在 IDE 启动配置中进行这些调整(例如,您添加-Dorg.freemarker.jsp.metaInfTldSources=classpath到 Java 选项)。这是一个您可以轻松重新实现的想法。


查看完整回答
反对 回复 2021-06-23
  • 2 回答
  • 0 关注
  • 234 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信