我在Tomcat 7中将一个Web应用程序部署为WAR文件 . 该应用程序构建为一个多模块项目:
-
core - 打包为JAR,包含大部分后端代码
-
core-api - 打包为JAR,包含对核心的接口
-
webapp - 打包为WAR,包含前端代码并依赖于核心
-
customer-extensions - 可选模块,打包为JAR
通常,我们可以将JSP文件放在webapp项目中,并相对于上下文引用它们:
/WEB-INF/jsp/someMagicalPage.jsp
问题是我们如何处理特定于客户扩展项目的JSP文件,这些文件不应始终包含在WAR中 . 不幸的是,我看不到JAR文件中的JSP . 尝试 classpath:jsp/customerMagicalPage.jsp
导致在JspServlet中找不到文件,因为它使用 ServletContext.getResource()
.
传统上,我们“解决”了maven解包客户扩展JAR,定位JSP,并在构建它时将它们放入WAR中 . 但理想的情况是,您只需在Tomcat中的爆炸WAR中放置JAR并发现扩展 - 这适用于除JSP之外的所有内容 .
反正有没有解决这个问题?标准方式,特定于Tomcat的方式,黑客还是变通方法?例如,我一直在考虑在应用程序启动时解压缩JSP ...
5 回答
Tomcat 7支持的Servlet 3.0包括将jsps打包到jar中的能力 .
你需要:
将你的jsps放在jar的
META-INF/resources
目录中可选地在jar的
META-INF
目录中包含web-fragment.xml
将jar放在战争的
WEB-INF/lib
目录中然后,您应该能够在您的上下文中引用您的jsps . 例如,如果你有一个jsp
META-INF/resources/test.jsp
,你应该可以在你的上下文的根目录引用它作为test.jsp
作为一种解决方法,我创建了一个类,它打开一个jar文件,查找与特定模式匹配的文件,并将这些文件提取到相对于上下文路径的给定位置 .
然后我在Spring XML中将其配置为bean:
它不是一个真正恼人的问题的最佳解决方案 . 现在的问题是,维护此代码的人会来吗?murder me while I sleep for doing this?
有这样的解决方法 - 您可以将JSP预编译为servlet . 因此,您将获得可以放入JAR的.class文件,并将web.xml映射到某些URL .
Struts 2团队为嵌入式JSP添加了一个插件 . 也许它可以用于基地 .
http://struts.apache.org/2.x/docs/embedded-jsp-plugin.html
这是一个很好的回答,我已经使用了,因为我们使用的服务器无法做任何高于servlet 2.5的服务器 .
我添加了一个方法来删除bean被销毁时添加的文件 .
然后我确实更改了构造函数,所以我可以使用所有java配置:
我希望有人帮这个人!