SSH框架之一詳解maven搭建多模塊項目

    閒來無事,思量着本身搭建一個ssh框架,一來回顧熟悉一下ssh的內容,hibernate還就沒用過了,生疏了都。二來整合一下,將其餘掌握的和正在學習的框架核技術糅合到一塊兒,就當是作一個demo練手了。css

    首先要把最基層的ssh框架運行起來,利用maven來構建,設想的是將業務分爲多個模塊,各個模塊之間相互獨立,甚至每一個模塊能夠獨立運行。查詢若干資料能夠利用maven建立model,而後整合爲一個項目,今天先介紹一下基於maven的多模塊項目搭建。html

多模塊其實就是按照層級的管理構建,項目包含一個pom.xml文件和若干個模塊,每一個模塊有一個單獨的pom.xml文件,經過pom的依賴和繼承關係來構建項目層次。廢話很少說,文采也很差,就直奔主題吧,首先貼一張項目結構圖:java

 

 

從上圖中能夠清楚的看到模塊與項目以及模塊與模塊之間的層級關係,解釋一下爲何這麼分模塊:jquery

web模塊存放的是客戶端資源,包括js,css,以及jsp等。其餘各模塊爲業務模塊,common爲公共模塊,其中封裝了公用的util工具類以及常量等。web

打包方式爲項目採用pom方式,業務模塊打成jar,web模塊打包成war包,最後的war包只包括web模塊下的資源,其餘業務模塊以jar形式存在war包中WEB-INF/lib文件夾下apache

tomcat

一、建立maven項目

Maven的安裝和配置就不細說了,打開eclipse首先新建一個maven項目,刪除src目錄(項目中是沒有代碼的,全部的代碼都是在各個模塊中編寫的),將buildpath中的source文件夾給remove掉,並將output文件夾修改到web模塊下web-inf/classes文件夾下(沒有則新建)。以下圖所示:框架

打開pom.xml文件,添加或修改代碼 :dom

<packaging>pom</packaging>

將項目的打包方式修改成pom方式,而後添加ssh相關的dependency和plugins等內容。eclipse

二、maven項目添加model

在項目上右鍵,新建選擇maven model:

輸入model名稱,next配置sshFrame和groupId完成後能夠看到工做空間中多了一個項目,打開模塊pom文件,稍做修改:

重點關注parent標籤,其配置的是該模塊所屬的父級項目,這裏固然配置頂級的項目了,子模塊的pom文件是繼承字父級的pom文件的,因此在父級pom中定義的dependencies在子模塊中能夠直接引用,模塊的屬性也只需定義一個artifactId就能夠了,groupId和version能夠從父級繼承,relativePath配置是父級pom.xml文件的相對路徑,通常能夠省略,不過有時會報錯,說找不到父級pom,因此就乾脆加上了。

    這時候再次打開項目的pom.xml文件能夠發現其中多了一個modules標籤,其中內容就是剛剛新建的模塊的artifactId。

其餘模塊的新建依此類推,過程是徹底同樣的。

三、編譯以及運行

模塊創建完成後,運行項目的pom文件,run as mvn install 下載jar,運行命令mvn compile進行編譯,編譯後能夠在各個模塊的target文件夾下看到編譯後的class文件,web模塊的輸出路徑最好也給改爲web-inf/classes下。編譯經過後就能夠啓動tomcat進行測試了,我使用的是tomcat插件,須要先進行配置。配置圖以下:

打開tomcat中server.xml文件,添加context。

啓動tomcat後訪問localhost:8080/ssh/user/toUserIndex.action便可查看到頁面效果了,該頁面訪問的是User模塊的action。

四、問題以及解決方案

在搭建過程當中出現了各類各樣的錯誤,也一直在摸索着前進,總結一下出現的問題和解決辦法。

(1) tomcat啓動後不能加載到其餘模塊的代碼,只加載到了web模塊。

答:運行mvn compile編譯後生成的class文件都是在各自模塊的target目錄下的,須要在tomcat配置中須要加載的模塊勾上,以下圖:

這樣再啓動tomcat就會加載到class文件了。

(2)、strus文件沒法引入其餘模塊的struts_user.xml文件

答:struts可使用include命令包含其餘的配置文件file屬性爲文件的地址

<include file="struts_config/struts_user.xml"></include>

這樣是能夠正確加載文件的,注意struts_config前面是沒有」/的。

(3)、模塊之間相互依賴的問題

項目過大,模塊過多的話可能多個模塊之間會存在相互依賴的關係,以下圖:

這樣使用maven編譯不能經過,要解決循環依賴有兩種解決辦法,一種就是重構代碼,從根本上解決依賴的問題。還有一種折中的辦法,使​用​build-helper-maven-plugin解​決​相​互​依​賴​的​問​題​我​的​解​決​辦​法​就​是​先​把​相​互​依 ​賴​的​模​塊​整​合​在​一​起​,相​當​於​把​這​些​模​塊​合​並​成​一​個​單​獨​的​模​塊​統​一​編​譯​。

依賴關係轉換爲多對一的關係,以下圖:

 

要​想​把​A、​B、​C三​個​模​塊​整​合​在​一​起​編​譯​,需​要​借​助​build-helper-maven-plugin插​件 ​,這​個​插​件​在​Maven構​建​周​期​提​供​一​些​輔​助​功​能​,下​面​列​出​插​件​的​提​供​的​功​能​列​表​: build-helper:add-source:添​加​更​多​的​構​建​源​碼​目​錄​ build-helper:add-test-source:添​加​更​多​的​測​試​源​碼​目​錄​ build-helper:add-resource:添​加​更​多​的​資​源​目​錄​ build-helper:add-test-resource:添​加​更​多​的​測​試​資​源​目​錄​ build-helper:attach-artifact:在​安​裝​和​部​署​周​期​附​加​artifacts build-helper:maven-version:添​加​一​個​指​定​當​前​Maven版​本​的​屬​性​ build-helper:parse-version:添​加​一​個​指​定​組​件​版​本​的​屬​性​ build-helper:released-version:決​定​當​前​項​目​的​最​終​版​本​ build-helper:remove-project-artifact:從​本​地​資​源​庫​中​移​除​項​目​的​artifacts build-helper:reserve-network-port:Reserve a list of random and unused network ports. 在​這​裏​我​們​要​用​到​build-helper:add-source這​個​功​能​,將​模​塊​A、​B、​C的​源​碼​路​徑​加 ​進​來​。​ 我​們​再​添​加​一​個​輔​助​模​塊​D,在​輔​助​模​塊​D中​使​用​build-helper-maven-plugin插​件​,然 ​後​讓​模​塊​A、​B、​C都​依​賴​於​輔​助​模​塊​D,模​塊​D的​POM模​型​如​下​:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <relativePath>../pom.xml</relativePath>
        <artifactId>sshFrame</artifactId>
        <groupId>org.lslvxy.sshFrame</groupId>
        <version>${project.version}</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>sshFrame-pack</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <module.common.src>../sshFrame-common/src/main/java</module.common.src>
        <module.user.src>../sshFrame-user/src/main/java</module.user.src>
        <module.role.src>../sshFrame-role/src/main/java</module.role.src>
    </properties>
    <build>
        <resources>
            <resource>
                <directory>../sshFrame-common/src/main/resources</directory>
            </resource>
            <resource>
                <directory>../sshFrame-user/src/main/resources</directory>
            </resource>
            <resource>
                <directory>../sshFrame-role/src/main/resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${module.common.src}</source>
                                <source>${module.user.src}</source>
                                <source>${module.role.src}</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

這樣就生成了一個模塊pack,將其餘模塊的源代碼和resource編譯到pack模塊中,而後其餘模塊依賴這一個pack模塊,啓動tomcat時加載pack模塊和web模塊便可正常啓動項目。

五、總結

至此,一個簡單的maven多模塊項目就搭建成功了,也能夠正常的運行和訪問。

不過須要完善和豐富內容還須要一部分工做。源代碼:

這個源碼中包含了jquery easyui作的界面,也纔剛剛開始作了一部分。

文采很差,寫的很亂,若是有什麼問題的話能夠給我留言或者qq我。

--本篇完--

相關文章
相關標籤/搜索