gpt4 book ai didi

jsp - 关于修改spring boot 1.5.3支持识别jsp文件

转载 作者:行者123 更新时间:2023-11-28 22:16:42 38 4
gpt4 key购买 nike

我用的是spring boot + jsp,来自this post我知道如果将 jsp 文件放在 src/main/resources/META-INF/resources/ 中也可以打包为可执行 jar。

不幸的是,当我将 spring boot 版本从 1.4.2 修改为 1.5.3 时,它不支持并返回 404。经过几个小时跟踪他们的源代码并比较我知道为什么 1.5.3 不支持它。

Spring Boot 1.4.2

//org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.StoreMergedWebXmlListener#onStart
private void onStart(Context context) {
ServletContext servletContext = context.getServletContext();
if(servletContext.getAttribute("org.apache.tomcat.util.scan.MergedWebXml") == null) {
servletContext.setAttribute("org.apache.tomcat.util.scan.MergedWebXml", this.getEmptyWebXml());
}
// only 1.4.2 has this line and with this code could recognise jsp files in /META-INF/resources/
TomcatResources.get(context).addClasspathResources();
}

Spring 启动 1.5.3

private void onStart(Context context) {
ServletContext servletContext = context.getServletContext();
if (servletContext.getAttribute(MERGED_WEB_XML) == null) {
servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml());
}
}

所以我想知道为什么1.4.2之后要去掉这段代码?

TomcatResources.get(context).addClasspathResources(); 

而且因为我还想使用1.5.3所以我必须通过下面的方式手动添加这段代码

1.复制TomcatEmbeddedServletContainerFactory源码到当前类路径 enter image description here

2.做以下修改

private void onStart(Context context) {
ServletContext servletContext = context.getServletContext();
if (servletContext.getAttribute(MERGED_WEB_XML) == null) {
servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml());
}
// Add below code
ClassLoader loader = getClass().getClassLoader();
URL[] urLs = ((URLClassLoader) loader).getURLs();
List<URL> list = new ArrayList<>();
//String file = "file:/Users/zhugw/workspace/boot-jar-serving-jsp/boot-jar-serving-jsp-1.0-SNAPSHOT.jar!/";
String file = urLs[0].getFile().replaceFirst("BOOT-INF/classes!/", "");
URL jar = new URL("jar", "", file);
list.add(0,jar);
TomcatResources.get(context).addResourceJars(list);
}

而且确实有效。我想知道是否可以这样做?

最佳答案

我们这里有相同的pb。

  1. 我们尝试了您的解决方案但未成功。启动应用程序时引发了以下异常:

...

Caused by: java.lang.IllegalAccessError: tried to access class org.springframework.boot.context.embedded.tomcat.TldSkipPatterns from class org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.(TomcatEmbeddedServletContainerFactory.java:130)

...

  1. 最后似乎调用了“TomcatResources.get(context).addClasspathResources();”尚未删除,但已重构。

现在在 SpringBoot 1.5.8.RELEASE 中,TomcatEmbeddedServletContainerFactory.prepareContext() 中有以下行:

context.addLifecycleListener(new LifecycleListener() {
@Override
public void lifecycleEvent(LifecycleEvent event) {
if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {
TomcatResources.get(context)
.addResourceJars(getUrlsOfJarsWithMetaInfResources());
}
}
});
  1. 在我们的案例中,我们使用了自定义的 EmbeddedServletContainerFactory(覆盖了 TomcatEmbeddedServletContainerFactory 的某些方法),并且由于未知原因,在 getUrlOfJarsWithMetaInfResources() 中检索到的类加载器几乎是空的(只有没有 jar 文件的类文件夹)。

解决方案:我们只是删除了此覆盖。 Jar 文件返回到类加载器中,因此应用现在可以正确识别存储在这些 jar 文件中的 jsp 文件。

关于jsp - 关于修改spring boot 1.5.3支持识别jsp文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44734046/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com