部署IDEA +maven+springmvc+dubbo項目

    最近開發了一個項目,記錄一下部署要點。

    項目採用IDEA開發,框架使用maven+spring mvc+dubbo。

    首先,新建項目。新建的時候先建maven,再添加spring mvc框架。具體可以參考IDEA搭建SpringMVC並用maven配置的小例子(非常詳細)

   建項目的時候不要跟之前已刪除過的項目重名,我發現如果重名後在maven初始化構建時很容易失敗。現在還沒有深究原因。

    如果要使用dubbo,那麼新建項目的時候一定要選擇spring mvc的版本是4以下的版本,我選擇的是“3.2.18”。因爲4以上改動非常大。

    設置IDEA爲自動下載jar包的源碼與文檔,點OK。


    如果Plugins有報錯,就說明maven包需要的插件沒有下載好,可以自己在本地用cmd 進入maven命令來手動下載。命令mvn install或者 mvn help:system

     如果Dependencies有報錯(有紅色波浪線),就說明使用了maven會有依賴衝突。這時候需要選擇界面右測的在垂直滾動條那裏的按鈕“Maven Projects”,選擇按鈕“Show depedencies”。打開後會有一張【層級圖】。圖裏如果有紅色線就代表這裏存在傳遞依賴衝突。以“最短路徑爲準”的原理,將另一個衝突包選中,然後右鍵,選擇exclude。這時候,就會在pom.xml裏面自動生成配置進行包排除。

    我是寫完代碼後,再加上springmvc註解的配置。springmvc有兩個重要配置:applicationContext.xml與dispatcher-servlet.xml。其中,dispatcher-servlet.xml他是與對應的servlet相關的名稱,你的servlet叫什麼,他就會生成“xxx_servlet.xml”的文件。

    applicationContext.xml與dispatcher-servlet.xml這兩個文件的區別在於:

  •     applicationContext.xml主要是與spring mvc密切關聯,所以我會把bean定義會寫在這裏。當然啦,如果你全寫在dispatcher-servlet.xml裏面也是可以的。因爲你寫一個helloworld的時候,applicationContext.xml其實是空的。寫這些的時候主要是那個beans裏面的XML配置實在是太難配了。所以一般我會找一個DEMO直接把引入頭拷貝進去再慢慢進行對比篩選。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/tool
        http://www.springframework.org/schema/tool/spring-tool.xsd">

    <bean id="connConfig" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>/WEB-INF/conf/connConfig.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="UTF-8"></property>
    </bean>
    <bean id = "propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="properties" ref="connConfig"></property>
    </bean>
    <import resource="dubbo.xml"/>
</beans>
  • dispatcher-servlet.xml主要是與servlet相關,全局的配置會寫在這裏。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/tool
    http://www.springframework.org/schema/tool/spring-tool.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 自動掃描該包,使SpringMVC認爲包下用了@controller註解的類是控制器 -->
    <context:component-scan base-package="com.lalalala.controller"/>
    <!-- 對靜態資源文件的訪問, 將無法mapping到Controller的path交給default servlet handler處理 -->
    <mvc:default-servlet-handler/>
    <!-- 啓用spring mvc 註解, 默認的註解映射的支持 -->
    <mvc:annotation-driven />


</beans>

    web.xml會自動生成配置。需要注意的地方有兩個:

  • 配置文件的路徑:配置文件路徑在標籤<param-value>裏面,會有classpath*:與相對路徑“WEB-INF/XXX....”這樣子的寫法。classpath指代的是src路徑下的文件,而相對路徑指代的是在本項目里路徑。在IDEA下,文件夾的路徑是不包含在包路徑裏面,只是單純爲了管理項目用的。
  • url-pattern需要設置爲<url-pattern>/<url-pattern>

    新建項目的時候不知道IDEA生成的時候會把WEB-INF放在一個叫web的文件夾下面?放在下面以後路徑一定不可以用classpath來指定。

    項目部署需要進入到“Project Structure”(在界面右上角)

    

    打開Artifacts將項目打成war包。步驟可以參考具體可以參考IDEA搭建SpringMVC並用maven配置的小例子(非常詳細)。這時會有兩個選擇:war與war explore的區別【war與war explore的區別】。一般我們會使用war exploded,畢竟熱部署可以減少重啓次數。


    使用Dubbo時需要注意Controller,我們都是會使用一個interface作爲接口類放在Controller中,但是這個接口類是不可以註冊爲bean,所以我們需要Dubbo在內存中註冊一個bean,將這個接口類臨時聲明爲bean,這樣,可以在springmvc中使用。如果配置成功後Controller裏面的接口類對象聲明還有波浪線,不要緊的,繼續執行就好。

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://code.alibabatech.com/schema/dubbo
	http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="${dubbo.appliaction}"/>這個是寫在配置文件裏面的,可以隨意起名
    <dubbo:registry address="${dubbo.registry.address}"/>
    <dubbo:protocol name="${dubbo.protocol}"/>

    <!-- consumer -->
    <dubbo:consumer timeout="${dubbo.timeout}"/>

    <dubbo:reference id="invoiceAPI" interface="com.invoice.service.api.lalalala"
                     url="${dubbo.url}/com.lalalala.service.api.lalaAPI"/>
</beans>

    實際運行起來,IDEA是把tomcat作爲一個容器進行使用。

    對應的地址在“C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat”路徑下,一個項目一個容器。

    若在運行運行時,出現404報錯。首先可以定位tomcat是否已正常啓動:可以把tomcat安裝目錄下的ROOT項目放在tomcat的Deployment裏面進行部署(注意:在IDEA裏面部署的時候,Application context在同一個tomcat容器裏部署的應用一定要作區分。Application context可以只爲/,也可以不跟項目名相同。)。重新啓動tomcat的時候,可以根據/ROOT去訪問,看下是否可以打開tomcat的那隻喵咪網頁。如果成功打開,則代表tomcat已經正常啓動了。否則,tomcat啓動失敗。

    若tomcat啓動報錯的時候,出現NoSuchClass或NoSuchMethod這種字樣,那有大概率說明項目裏存在jar包衝突 。如果是類衝突,此時可以用ctrl+N去查看一個類是不是指向兩個包中的對應類,如果有,就用Maven Projects來進行exclude。如果沒有找到類的源文件,則去查找對應的jar包,並引入。NoSuchMethod的話,說明引用缺失。

    一步一步排查,最後成功。


遺留問題:

Q:IDEA裏面新建的項目裏會有兩級存放WEB-INF的目錄,web/webappsrc/webapp,其中,web與src是同級的區別 ?

A:沒有什麼區別,就是不同框架新建起來不同的目錄的配置。主要還是看配置裏配的是哪個。配置如下


Q:TOMCAT啓動的時候沒有報錯,但是你進入程序的時候外層的類實例是被初始化,假設爲A a。但是a.x1就沒有被初始化,x1是類B的實例。

A:在<dispatcher-servlet.xml>及<applicationContext.xml>文件中一定要加入<context:annotation-config>這一句。這句是spring中開啓@Authwired註解方法的。

Q:<context:annotation-config>與<mvc:annoation-driven>的區別

A:<context:annotation-config>是spring用於開啓@Authwired註解; <mvc:annoation-driven>是spring mvc用於開啓@Authwired註解

爲什麼IDEA自帶的maven不好用呢?

爲什麼exclude會變成灰色?










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章