閑來無事,思量着自己搭建一個ssh框架,一來回顧熟悉一下ssh的內容,hibernate還就沒用過了,生疏了都。二來整合一下,將其他掌握的和正在學習的框架核技術糅合到一起,就當是做一個demo練手了。
首先要把最基層的ssh框架運行起來,利用maven來構建,設想的是將業務分為多個模塊,各個模塊之間相互獨立,甚至每個模塊可以獨立運行。查詢若干資料可以利用maven創建model,然后整合為一個項目,今天先介紹一下基於maven的多模塊項目搭建。
多模塊其實就是按照層級的管理構建,項目包含一個pom.xml文件和若干個模塊,每個模塊有一個單獨的pom.xml文件,通過pom的依賴和繼承關系來構建項目層次。廢話不多說,文采也不好,就直奔主題吧,首先貼一張項目結構圖:

從上圖中可以清楚的看到模塊與項目以及模塊與模塊之間的層級關系,解釋一下為什么這么分模塊:
web模塊存放的是客戶端資源,包括js,css,以及jsp等。其他各模塊為業務模塊,common為公共模塊,其中封裝了公用的util工具類以及常量等。
打包方式為項目采用pom方式,業務模塊打成jar,web模塊打包成war包,最后的war包只包括web模塊下的資源,其他業務模塊以jar形式存在war包中WEB-INF/lib文件夾下
。
1、創建maven項目
Maven的安裝和配置就不細說了,打開eclipse首先新建一個maven項目,刪除src目錄(項目中是沒有代碼的,所有的代碼都是在各個模塊中編寫的),將buildpath中的source文件夾給remove掉,並將output文件夾修改到web模塊下web-inf/classes文件夾下(沒有則新建)。如下圖所示:

打開pom.xml文件,添加或修改代碼 :
<packaging>pom</packaging>
將項目的打包方式修改為pom方式,然后添加ssh相關的dependency和plugins等內容。
2、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。
其他模塊的新建依此類推,過程是完全一樣的。
3、編譯以及運行
模塊建立完成后,運行項目的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。
4、問題以及解決方案
在搭建過程中出現了各種各樣的錯誤,也一直在摸索着前進,總結一下出現的問題和解決辦法。
(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模塊即可正常啟動項目。
5、總結
至此,一個簡單的maven多模塊項目就搭建成功了,也可以正常的運行和訪問。
不過需要完善和豐富內容還需要一部分工作。源代碼:
這個源碼中包含了jquery easyui做的界面,也才剛剛開始做了一部分。
文采不好,寫的很亂,如果有什么問題的話可以給我留言或者qq我。
--本篇完--
