WEB应用打成jar包全记录

内容属原创,转载请注明出处

题外

  由于项目的需求—不管是怎么产生的这个需求—总之,需要支持把一个web应用打成jar包供其他应用使用,这就有了下面的过程。

这个过程里用到了Spring和SpringMVC(用到的版本是3.1.4,后面略过此描述)的若干东东,如果不用这玩意的,请飘过。

要做些什么?

需要打包的这个Web应用包含下面这些内容:

  1. 静态资源,含 js、css、image
  2. 页面文件:jsp
  3. Jsp标签,含 tld文件和若干java代码
  4. 基于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" />

  这里有下面几个坑:

  1. 进入到这个配置里面的静态资源,需要被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目录呢。想了个办法,处理如下:

  1. 新建一个resource目录,比如命名为 resource
  2. 在resource里新建目录 META-INF
  3. 把tld文件拷贝到META-INF
  4. 在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的注解无效。

  

成果在哪里

  这么个若干步骤以后,得到了什么呢?

  产出物有如下一些:

  1. 一个普通的jar,且命名为 com.test.base-1.0.0.jar
  2. Jsp的jar,且命名为 com.test.base.jsp-1.0.0.jar
  3. JSP转成servlet的配置文件,且命名为 jspServlet.txt

  如此,只要在要引用这个web应用的工程lib下扔这两个jar(当然同时要扔过去若干个相干的其他jar包),再在 web.xm里把这个 jspServlet引入,大功告成。

成功了吗?

  如果,如我一般,spring用的3.1.4,web.xml里的版本是3.0,tomcat用的不是版本太旧,我想是会成功的吧。

  恕我未在其他web容器上测试,也未测试其他版本的spring

  谨以此文,感谢在度娘的帮助下给过我帮助的若干人。

WEB应用打成jar包全记录

时间: 2024-10-06 00:32:57

WEB应用打成jar包全记录的相关文章

打成Jar包后运行报错 Unable to locate Spring NamespaceHandler for XML schema namespace

MAVEN项目,在IDEA中运行正常,但是把它打成jar包后再运行就会出现异常: Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.sp

myeclipse maven 打成jar包 对要执行的main方法暴露出去,通过java -jar 命令后跟打包好的jar文件回车就可以执行暴露的main线程方法

在该maven项目的pom.xml中添加: <plugin>          <artifactId>maven-assembly-plugin</artifactId>          <configuration>              <archive>                  <manifest>                      <mainClass>com.xha.db.service

maven web 项目 打入 jar 包 , 和编译入 java 文件到 web-inf 下

<outputDirectory>src\main\webapp\WEB-INF\classes</outputDirectory> 可以把 类文件编译到 web-inf 下 ,用于项目运行<plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.1</version> <executions> <execution>

使用myeclipse将Java项目打成jar包遇到classnotfound的问题解决办法

今天做一个东西,把Java项目打包成jar文件.折腾了俩小时,到最后还是执行jar文件就报classnotfound异常,我感觉是所写的程序中依赖的jar包没有打进去,但我手动加了,还是不行.网上找了好多办法,还是不行.后来,问了一技术大牛的朋友,才知道问题出在哪了. 选择runnable jar file,而不是jar file(我的myeclipse版本是6.5,没有这个runnable jar file选项) next 选择"package required libraries into

Intellij IDEA将java源码打成jar包

得到一份java源码,要打成jar包,怎么做? 1.打开File-->ProjectStructure-->Artifacts 2.点击"+",选择"Jar",选择Empty或From modules with dependencies,后者会把在项目中用到的Jar包解压开,当成项目的一部分,打包到最后的Jar包中.但是这样会有一个问题,即,如果项目中引用的Jar包有签名过,最后打包成的Jar包运行时会抛出错误:"java.lang.Secur

把自己的程序打成jar包,让别人调用

 我们写程序的时候往往需要把自己的程序打包成jar包,给第三方调用.Eclipse让我们非常方便的可以导出jar包.但是当程序里需要用到res里的资源时,往往就会出现问题.因为统自动生成的R类如果被打到jar包中后,就失去了索引资源的作用.导致封装成jar包的view无法获取对应资源.因为R类的属性值是在应用编译打包时由系统自动分配的.R类打包之后失效,实际是因为R类的内部类里面的属性失效,因为打包之后这些属性的值就固定了,但是实际项目中这些值是在编译时有系统自动分配的,无法在编译前固定. 本文

Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来替换里面的资源图片,文字等一些资源文件问题,我本来想这个简单,用两个工程直接替换里面的资源文件就行,老大说,这样子不好,如果要改需要改两个客户端,而且还麻烦,叫我将所有的Activity打成Jar包的形式,这样子我们改了里面的内容就直接发布Jar包出去,其他公司直接下载Jar来使用,这样子他们自己公

Web项目打成war包部署到tomcat时报MySQL Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)错误解决方案

Web项目使用使用root账号root密码进行部署,通过Eclipse加载到Tomcat服务器可以发布成功,打成war包放到tomcat的webapps目录无法发布成功,报错: jdbc.properties涉及Mysql配置: 错误很明显,与MySQL密码有关,但是两种方式部署项目使用的jdbc.properties配置文件是一样的.所以肯定不是密码不对引起的,只好找度娘,O(∩_∩)O哈哈~. 网上大部分帖通过运行mysql -u root -p命令登录时也会报这个错误,所以,我就尝试这种方

Web项目打成war包部署Tomcat时运行startup.bat直接闪退部署失败解决方案

即上篇通过将web项目打成war包部署到Tomcat服务器,解决mysql问题后,又出现了新问题,真是一波三折,所以将解决过程分享给大家,希望能帮助到小伙伴们~ 将打好的war包拷贝到Tomcat的webapps目录,然后在Tomcat的bin目录找到startup.bat批处理文件,直接双击执行,结果运行几秒后直接闪退,顿时有种不好的预感,在浏览器访问web项目,结果连localhost:8080都无法访问,web项目未发布成功,一脸懵逼~ 没有日志看不到为啥发布不成功额,想了想,可以稍微修改