Maven 打包jsp/js/jsp靜態資源到 JAR 包中(Servlet3.0模組化特性與Maven結合應用)__Java

來源:互聯網
上載者:User

先吐槽一下,本人踩過很多坑,淚流滿面啊,有因為不熟悉 maven 的,有 eclipse bug 的,有網上文章資訊不對稱的……
好吧,回到正題,我們需求是這樣子滴: 一個項目由多個工程組成。因為項目是複雜的,大的,所以劃分為多個子項目(或者說工程)比較好一點 那麼問題來了,父與子工程的依賴怎麼處理。打包構建怎麼處理。 怎麼破。用 maven 唄; 我們都知道 maven 強大,可是伴隨著強大的同義字是複雜。這也就是我之前喜歡用 ant 而不是 maven 的緣故。 我們都知道,工程最終要打包為 jar/war 部署的。對於 IDE 而言,從它的方面去理解的話,其實還存在一個隱含的內建環境:就是我們開發時候,敲代碼、測試、改 bug 的 IDE 環境,是我們開發人員主要花時間的環境,這時 IDE 可以檢查依賴的包是否匯入了,能否提供代碼聯想功能……等等——這兩個環境是不同的於是處理起來也是不一樣的——這也就是為什麼敲代碼時候 IDE 依賴正確,看不出什麼問題,但是運行時候卻報錯出現 Class Not Found 的原因;下面我們逐一分析; 首先是開發環境。我們希望,各個項目的依賴的自動的、同步的。啥意思。就是子工程 B 依賴父工程 A,我修改了 A 的代碼,B 那裡會有所反應,知曉的。誰也不想手動 build A一下 B 工程才能用,這應該 maven/eclipse 後台自動幫我們做的。 這需求很普遍是吧,沒問題,maven 可以這樣子做,只要在 pom.xml 聲明依賴就可以了(當然前提都是本地的工程) 如下圖所示,依賴了 ajaxjs-base/data 兩個工程,代碼可以自動同步的
可見那不是 jar 包。但如果在 eclipse 裡面 close 了 ajaxjs-base/data 工程,那麼 maven 就不依賴本地工程,而是提供 jar 包; 嗯,到目前為止一切很好是吧。。 不過~只是 for 純 java 項目而論的。web 工程就不行,不能自動同步。。。 這裡多說一句,沒接觸 maven 之前,我用 eclipse link resource 功能,build war 也可以,也蠻不錯,同步啥檔案都可以。 打包失敗。

苦思良久,Distributed System Performance Monitor氏般嘗試百草的方法都試過,無甚所獲。maven 會把整個 Web 專案打成 jar 而非標準的 java jar 包。
後來皇天不負有心人,正確的操作姿勢是依賴 war 包:

“dependency type war 就可以實現war包依賴,B依賴A,打包的時候就會把A的classes以及檔案打進去”

<dependency><groupId>com.handlecode</groupId><artifactId>diy-biz</artifactId><version>${diy.version}</version><type>war</type></dependency>

http://blog.csdn.net/sxhong/article/details/72869359

當然依賴的工程類型是 war。

這樣 WEB-INF 會有包含 war 的包,這是 eclipse 調試時的臨時目錄。
別問為什麼可以是 war,人家都是 jar。我也不知道,反正可以讀到裡面的 class……

然後 build 的時候走的是 maven-war-plugin 外掛程式。再次強調,問題分兩個方面的,一個是滿足開發環境的匹配,一個是最終打包環境的匹配。解決了一個問題不等於解決另外一個問題,而且有時候會兩個問題是矛盾的。
上述這個方法僅限於 java 代碼複用、同步。 打包 jsp/html/js/jpg 資源

將項目依賴 war 包就可以了匯入父工程的 class。可是1、那不是 jar 包,而且包含其他沒用的 jsp 等;2、不能匯入靜態資源;3、父工程必須為 war 類,而我要 build 一份 jar 給別人用的,改 pom.xml 是可以但很麻煩。

有朋友問,為啥 jsp/html/js/jpg 資源匯入 jar。複用唄、重用唄~都是公用的資源。請君看看 Servlet 3.0 新特性:

在Servlet3.0協議規範中指出:${jar}/META-INF/resources/被視為根目錄。那麼將jsp等靜態資源打入META-INF/resources/目錄下就與實際項目沒有區別了。

也就是說 jsp 在 jar 是可以啟動並執行。還有 webfragment.xml 也應該要支援。
我覺得這很有價值,尤其全棧的 js 代碼當然想一塊拉進來。你懂的~
具體操作請接著看。 啟用 webfragment 項目

標準的東西 eclispe 肯定支援,只不過很少用而已。

webfragment 項目特點是不能放在 tomcat 裡運行,其他與標準 DynamicWeb項目 無異。
你不想建立project 也可以,改 project fact 唄~

eclipse 死活不能在ui裡改,改配置唄,
找到 org.eclipse.wst.common.project.facet.core.xml

<?xml version="1.0" encoding="UTF-8"?><faceted-project>  <fixed facet="wst.jsdt.web"/>  <installed facet="java" version="1.7"/>  <installed facet="wst.jsdt.web" version="1.0"/>  <installed facet="jst.webfragment" version="3.0"/></faceted-project>

好了 轉為 Maven 項目

當然你也可以建立 maven 項目再轉 porject fact,順序無所謂。pom.xml 一定要設定 jar 類型的
Deployment Assembly 設定

其實就算是 DynamicWeb工程也可以,因為關鍵設定是 Deployment Assembly,設定對了就行。
不過我們先明確下需求,欲產生的 jar 包是這樣的。

MEA-INF 目錄下有 web-fragment.xml;resources 是像 WebContent ,都是 jsp/js 你喜歡放啥都行;tags 是放 tld 自訂標籤的(吐槽一句不支援 tag files。)
必須按這樣的結構來放到 web-inf/lib 下 tomcat 或者 jetty 等的 servlet 容器才能讀取。
重頭戲來了。Deployment Assembly 必須是這樣子滴:
指定 /META-INF 對應根目錄。其實 WebContent 目錄沒必要存在了,都放到 META-INF 下面好了 /src/main 是指定 java 檔案的,都給我放到根目錄下去~

很好,這就是 jar 裡面的結構了。每當你修改了一些東西包括 jsp,B工程也會同步知曉。eclispe/mavne 會在後面辛勤地勞作,打包成這樣:
最後補充 到目前為止只是說了 開發環境的打包,沒說構建的打包。之前我弄過,也不能難,肯定比 eclipse 下靈活、自由。 我的不是標準 Maven項目的目錄結構,而是傳統的DynamicWeb項目結構,有些不同但不影響,關鍵配置對就行(這裡插一句,之前尼瑪報錯 出現 “Updating status for Tomcat v6.0 Server at localhost…”. java.lang.NullPointerException 莫名其妙的,後來升級 eclipse 就行)

參考:
http://blog.csdn.net/sxhong/article/details/72869359
http://blog.csdn.net/u011666411/article/details/77160907
http://blog.csdn.net/mafan121/article/details/51862933
https://segmentfault.com/a/1190000007166005

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.