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

 

  謹以此文,感謝在度娘的幫助下給過我幫助的若干人。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM