WEB应用打成jar包全记录
内容属原创,转载请注明出处
题外
由于项目的需求—不管是怎么产生的这个需求—总之,需要支持把一个web应用打成jar包供其他应用使用,这就有了下面的过程。
这个过程里用到了Spring和SpringMVC(用到的版本是3.1.4,后面略过此描述)的若干东东,如果不用这玩意的,请飘过。
要做些什么?
需要打包的这个Web应用包含下面这些内容:
- 静态资源,含 js、css、image
- 页面文件:jsp
- Jsp标签,含 tld文件和若干java代码
- 基于SpringMVC的其他若干Control和Service
要把web应用打包,需要支持上面的这些文件打包,且打包后要能正常访问。
解决的方法
静态资源
SpringMVC提供了一个叫做 mvc:resources 的东东,这个东东使用后可以访问打在jar里的静态文件(具体mvc:resources是个什么东东且问度娘)且看配置示例:
dispatcher-servlet.xml 的配置:
<mvc:resources mapping="/test/js/**" location="classpath:/staticRes/test/js/" cache-period="31556926" />
这里有下面几个坑:
- 进入到这个配置里面的静态资源,需要被spring的servlet拦截到,且看配置:
web.xml的配置:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:dispatcher-servlet.xml
</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/test/js/*</url-pattern>
</servlet-mapping>
2. 对于springMVC而言,在上面的配置中,resources的mapping里的路径,相对的是经过web.xml的servlet-mapping中的url-pattern匹配后的路径,比如访问的资源文件是: /test/js/test.js,被weib.xml匹配后,进入到mvc:resources里判断用的路径就是 /test.js,而 mapping里配置的是 /test/js/** ,这样导致匹配不成功,也就不会定位到后面的location中去。
这个坑有点大,基于某种原因,test目录下除了有js,还有jsp、css等若干文件,最终,修改了springMVC的一点点代码:
类:org.springframework.web.servlet.handler. AbstractUrlHandlerMapping
方法:getHandlerInternal
原代码:

修改后的代码:

有了上面这个配置,需要做的只是把静态资源打到jar包并配置好相应的映射路径。
页面文件
解决了静态资源,jsp页面要另外想办法了。鉴于容器会把jsp文件生成java编译成class,那么是不是可以考虑把jsp资源生成class打到jar包呢。在度娘的不懈帮助下,这位哥们告诉了我怎么做:
jsp变为jar包:http://mrhouzhibin.blog.163.com/blog/static/19459624120120119445038/
既然有这么好的东东,拿来用呗。
很顺利的jar生成了,jsp对应的servlet配置也生成了,但是又碰到了一个问题,这么多jsp的servlet,如果都扔到web.xml,后续维护还不得头疼死,有没有办法把web.xml拆分呢?答案自然是有的,度娘说,请参考下文:
如何在web.xml文件中引入其他的xml文件http://www.blogjava.net/jiangjf/archive/2009/04/13/264685.html
注意了:

考虑到xml文件在eclipse老是会validate出错,就把生成的jsp对应的servlet的文件名后缀改成了txt,然后再在web.xml里引入,搞定。
JSP标签
Jsp标签里的java代码是没有什么特别的,就是 *.tld 文件要想想办法。话说容器解析时好像只解析WEB-INF目录下的tld和jar包里的META-INF 中的tld文件,怎么样才能让tld文件在需要打包的web应用里可用,又打包的时候打到META-INF目录呢。想了个办法,处理如下:
- 新建一个resource目录,比如命名为 resource
- 在resource里新建目录 META-INF
- 把tld文件拷贝到META-INF
- 在web应用的web.xml里添加如下配置:
<jsp-config>
<taglib>
<taglib-uri>http://www.test.com/jsp/t</taglib-uri>
<taglib-location>classes/META-INF/test.tld</taglib-location>
</taglib>
</jsp-config>
这样打出来的jar包中 tld文件在META-INF目录下,不需要再在web.xml里配置了。
基于Spring的若干代码
这里就是基本的一些java代码,本来就该在jar里的,只是有点点小坑,在导出jar包的时候,需要勾选一个东东,否则Spring的注解无效。

成果在哪里
这么个若干步骤以后,得到了什么呢?
产出物有如下一些:
- 一个普通的jar,且命名为 com.test.base-1.0.0.jar
- Jsp的jar,且命名为 com.test.base.jsp-1.0.0.jar
- JSP转成servlet的配置文件,且命名为 jspServlet.txt
如此,只要在要引用这个web应用的工程lib下扔这两个jar(当然同时要扔过去若干个相干的其他jar包),再在 web.xm里把这个 jspServlet引入,大功告成。
成功了吗?
如果,如我一般,spring用的3.1.4,web.xml里的版本是3.0,tomcat用的不是版本太旧,我想是会成功的吧。
恕我未在其他web容器上测试,也未测试其他版本的spring
谨以此文,感谢在度娘的帮助下给过我帮助的若干人。
WEB应用打成jar包全记录的更多相关文章
- springboot项目发布到独立的tomcat中运行&打成jar包运行
springboot的打包方式依赖于插件:(下面插件打出的包与普通的包目录结构有区别) <plugin> <groupId>org.springframework.boot&l ...
- java项目打成jar包时引用了第三方jar,此时我们该如何解决呢
Web项目做多了,反而对单纯的java项目陌生了,今天我们在开发项目的过程中,碰到一个这样的需求:需要将java项目放到linux系统上跑起来,当然这个javaSE项目是带main方法的.我们知道在I ...
- maven打包 tomcat运行pom配置 或 打成jar包
maven打包 tomcat运行pom配置,同时还需要配置org.apache.tomcat.maven插件,这里省略. <groupId>com.company</groupId& ...
- 使用maven将项目打成jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- SpringBoot打成jar包后,获取不到读取resources目录下文件路径的问题
问题描述: Springboot没有打成jar之前,可以成功获取读取resources目录下xxx.json文件的 路径.但是打成jar包后,接口调不通,原因是获取不到文件的路径. 原因: 在本地进行 ...
- 打成Jar包后运行报错 Unable to locate Spring NamespaceHandler for XML schema namespace
MAVEN项目,在IDEA中运行正常,但是把它打成jar包后再运行就会出现异常: Exception in thread "main" org.springframework. ...
- springboot整合JSP以及发布项目到独立的tomcat中与打成jar包使用
之前研究了springboot整合freemarker与thymeleaf的使用.也研究了springboot发布到独立的tomcat的使用以及使用自带的tomcat打成jar包的使用,下面研究集成J ...
- 将web项目打成war包部署在tomcat步骤
将web项目打成war包部署在tomcat步骤 1.将自己的项目打成war包. 2.将打包好的war复制到${tomcat.home}/webapps项目下. 3.在${tomcat.hom}/con ...
- Eclipse中将java类打成jar包形式运行
记录一次帮助小伙伴将java类打成jar包运行 1.创建java project项目 file > new > project > java project 随便起一个项目名称,fi ...
随机推荐
- 一、Windows下Git的安装与配置
一.下载Git安装包 1.打开Git的官方网站:https://git-scm.com/ 2.找到下载页:https://git-scm.com/downloads 3.找到Windows版本下载页面 ...
- 实验吧 这个看起来有点简单!&渗透测试工具sqlmap基础教程
题目地址:http://ctf5.shiyanbar.com/8/index.php?id=1 下载sqlmap,拖到python安装文件夹下面,在桌面创建sqlmap的cmd快捷方式,都不赘述. 教 ...
- JavaWeb学习 (十四)————JSP基础语法
一.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素. JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. 二.JSP表达式 JSP脚本表达式(expression)用于将 ...
- [转]git操作指南
[GIT上手篇]-1-基本操作(初始化仓库,添加.提交文件) 创建(初始化)一个GIT库 init 命令 说明:用于仓库的初始化 参数:--bare 创建一个纯仓库(不含缓存区和工作目录,服务器一般采 ...
- JavaScript之破解数独(附详细代码)
在上一篇分享中,我们用Python和Django来破解数独,这对不熟悉Python和Django的人来说是非常不友好的.这次,笔者只用HTML和JavaScript写了破解数独的程序,对于熟悉前端 ...
- (整理)Sublime Text 3 安装、破解、安装Package Control、汉化、添加到右键菜单、代码格式化、禁止更新
Sublime Text 3好用,但是每次安装到最后用着顺手,得在网上找半天安装.破解.安装Package Control.汉化.添加到右键菜单.代码格式化等等的教程,今天有空给自己整理一下吧. 一. ...
- sql 去掉 空格
一.问题描述: 数据库中字段 nvarchar类型 存放数据如下: '3.3×10' 二.解决方案: --测试用例CREATE TABLE #temp(NAME NVARCHAR(20) null) ...
- Java,第16天,属性与方法;
public class 类名{ private double 财产 = 0://设一个财产的属性: public void 一个月工资(){ this.财产 +=4500: }//设一个方法增加财产 ...
- 浅析"WeixinJSBridge is not defined"
Fundebug并没有使用微信 JS-SDK,然而却收到了WeixinJSBridge is not defined的报错: 我们的用户也收到了类似的错误报警,并且很多开发者都遇到类似的问题: 我的微 ...
- blfs(systemv版本)学习笔记-前几章节的脚本配置
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 记录blfs书籍前几个章节的配置内容. bash shell启动文件章节 1.切换root用户 su 2.创建/etc/prof ...