【发布时间】:2017-11-27 18:40:42
【问题描述】:
我用的是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();
}
春季启动 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的源代码复制到当前类路径
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);
}
它确实有效。我想知道是否可以这样做?
【问题讨论】:
标签: jsp tomcat spring-boot