Intellij Idea下打包JavaWeb項目忽略外部依賴包(Tomcat為例)打賞

使用Intellij Idea有一段時間了(將近一年),從一開始的不習慣,到現在的高效開發,一切都顯得是那么的自然而然。

由于前段時間一直做的項目并非傳統Web項目,而是純Restful風格的WebService,故而沒有使用到基本的Servlet Api(Restful采用封裝好的框架——Jersey,開發時不涉及Servlet Api的調用),也沒有直接引入諸如Tomcat之類中間件自帶的Jar包,所以一直沒有發現問題。

直到最近,一個小項目的兄弟神奇的采用了Tomcat6的工具類實現文件上傳,他開發使用的是eclipse,切換到我的Intellij Idea上面,發現編譯不通過,就順手在Libraries里面添加了Tomcat的Lib目錄,自以為完美解決了,不料Tomcat6、Tomcat7啟動時均會報錯,有一段時間甚至引入Tomcat6的Lib,運行在Tomcat7下,由于關鍵API改動不大,而用到的Tomcat6文件上傳工具類在Tomcat7更名或移除了,所以這樣奇葩的開發了近一周時間,通過查看編譯后的輸出文件,了解到,Intellij Idea是吧Tomcat的Jar包也同時輸出了,當然,打包的時候也會包含在War包內,不過由于項目緊張,一時沒來得及找方法,后面實在不爽,就留意了一下網友們的說法:

Tomcat6報錯java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor

Tomcat7報錯org.apache.catalina.deploy.WebXml addFilter…

其實均為同一錯誤,就是項目內打包了Tomcat的Jar包,大部分人給出的解決方案是在Tomacat的context.xml文件里的<Context>中加上<Loader delegate="true" />,嘗試了,確實可用,于是這樣又使用了兩三天。

之后想到,如果部署生產環節的話,每次更改Tomcat配置肯定不爽,之前使用eclipse的時候Tomcat的Jar包實際是以Runtime Libraries的形式引入的,運行或輸出War包的時候,根本不會進入包內,既然如此,Intellij Idea這么風靡的IDE,應該也會有此類功能吧?

事實證明,確實如此,由于Intellij Idea的智能,之前曾在嘗試移除Artifacts中Tomcat Jar包時候,曾提示可以把Tomcat Lib添加至Artifacts或者設置為Provided,但是設置之后發現還是不可用,于是就沒有繼續嘗試。這次嘗試中,發現,在Intellij Idea的Libraries中添加的Java Lib實際上自動帶入了Modules的Dependencies,在這里即可選擇Java Lib的作用域(Scope),也有Runtime,但是選擇了還是會報錯,而Provided則依然有問題,最后嘗試性的將Tomcat的Lib從Libraries移除,打算在Dependencies中直接添加,才發現自己真是傻到爆了,在Dependencies的添加列表里面選擇Library…菜單,打開窗口中就已經包含了Application Server Libraries(汗顏),選中之后Scope類型直接就是Provided,重新啟動Tomcat,完美運行了,創建Archive包時也不會輸出Tomcat的Lib了。

本打算配圖,但是由于操作簡單,而且可能官網有類似說明,而我沒注意到,所以這里不再班門弄斧了,僅簡單記錄一下,供有需要又恰巧和我一樣糊涂的朋友一閱。

Intellij Idea下打包JavaWeb項目忽略外部依賴包(Tomcat為例)
文章《Intellij Idea下打包JavaWeb項目忽略外部依賴包(Tomcat為例)》二維碼
  • 微信打賞
  • 支付寶打賞

已有6條評論

  1. 廣告聯盟官網

    (Tomcat為例)

    2015-05-21 15:12 回復
  2. 三亞婚紗攝影

    路過留言了

    2015-05-19 17:48 回復
  3. 火鍋桌椅

    做個樸實的人有幾個人能真正做到

    2015-05-18 16:57 回復
  4. 何捷浪

    加油~好~萌菌網www.moejun.tv/

    2015-04-27 09:54 回復
  5. 夢續代碼

    過段時間就要學Java Web了,有什么推薦的路線或書么

    2015-04-19 10:47 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖