1. 程式人生 > >深入淺出maven系列(三)---maven構建ssh工程(父工程與子模組的拆分與耦合) 前一節我們初識了maven並且掌握了maven的常規使用,這一節就來講講它的一個重要的場景,也就是通過maven將一個ssh專案分隔為不同的幾個部門獨立開發,很重要,加油!!!

深入淺出maven系列(三)---maven構建ssh工程(父工程與子模組的拆分與耦合) 前一節我們初識了maven並且掌握了maven的常規使用,這一節就來講講它的一個重要的場景,也就是通過maven將一個ssh專案分隔為不同的幾個部門獨立開發,很重要,加油!!!

        前一節我們初識了maven並且掌握了maven的常規使用,這一節就來講講它的一個重要的場景,也就是通過maven將一個ssh專案分隔為不同的幾個部門獨立開發,很重要,加油!!!

一、maven父工程與子模組的拆分與聚合原理
      問題描述:將ssh工程拆分為多個模組開發
        1.1、拆分原理         建立一個maven project(pom),然後在建立三個子模組(maven moudule),其中三個子模組,分別為 dao、service、web,也就是將三層的內容分別獨立為一個專案,進一步將耦合性降低,其中如何將他們連線起來了,看下圖。

     

            為什麼需要建立parent父工程來管理其下三個子模組呢?並讓其子模組繼承他呢?

            繼承是為了消除重複,如果將dao、service、web分開建立獨立的工程則每個工程的pom.xml檔案中的內容存在重複,比如:設定編譯版本、鎖定spring的版本的等,可以將這些重複的配置提取出來在父工程的pom.xml中定義

            將三層都獨立分開來了,web層如何呼叫service層程式碼?service層又如何呼叫dao層的程式碼呢?

            這個在沒有maven之前是不可以這樣做的,但是有了maven一切都不一樣了,web層呼叫service層的程式碼其實很簡單,因為service是一個完整的專案,那麼我們在web層這個專案中想要使用別得專案中的程式碼,只需要通過maven的pom.xml檔案編寫對應的座標,將其jar包加入進來即可達到目的,因此,看圖中,ssh-web依賴ssh-service,ssh-service依賴ssh-dao,其中的原理就是我說的這樣,所以才能將這三層分開成獨立的專案,並且進一步抽取其公有依賴的jar包,統一交由父工程來管理,這就maven帶來的效果。

        1.2、聚合原理

    專案開發通常是分組分模組開發,每個模組開發完成要執行整個工程需要將每個模組聚合在一起執行,比如:dao、service、web三個工程最終會打一個獨立的war執行

二、案例實現
       問題描述:使用maven將ssh專案進行分模組,並且實現從web到dao層的資料的存取進行實驗
        2.1、建立maven-parent父模組                  點選next

        

點選next
        
建立好之後的父工程如圖
         
        從它的目錄結構可以看出,父工程本身不寫程式碼,它裡面有一個pom.xml檔案,這個檔案可以將多個子模組中通用的jar所對應的座標,集中在父工程中配置,將來的子模組就可以不需要在pom.xml中配置通用jar的座標了
        在父工程的pom.xml中抽取一些重複的配置的,比如:鎖定jar包的版本、設定編譯版本等,一般這種都不需要我們自己臨時配置,網上或者公司都有已經寫好了的,每次使用就直接丟過來即可。下面給一個我收藏的額。嘿嘿

<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">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.beibei</groupId>
	<artifactId>ssh_parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<!-- 為了確定每個框架的版本號 -->
	<!-- 鎖定版本 -->
	<properties>
		<spring.version>5.0.7.RELEASE</spring.version>
		<struts2.version>2.3.24</struts2.version>
		<hibernate.version>5.0.7.Final</hibernate.version>
		<slf4j.version>1.6.6</slf4j.version>
		<log4j.version>1.2.12</log4j.version>
		<shiro.version>1.2.3</shiro.version>
		<cxf.version>3.0.1</cxf.version>
		<c3p0.version>0.9.1.2</c3p0.version>
		<mysql.version>5.1.6</mysql.version>
	</properties>

	<!-- 鎖定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-aspects</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-orm</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-test</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-web</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.hibernate</groupId>
				<artifactId>hibernate-core</artifactId>
				<version>${hibernate.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.struts</groupId>
				<artifactId>struts2-core</artifactId>
				<version>${struts2.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.struts</groupId>
				<artifactId>struts2-spring-plugin</artifactId>
				<version>${struts2.version}</version>
			</dependency>

		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.4</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.1.37</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.9.1</version>
		</dependency>
		
		<!-- <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> 
			<version>2.2.1</version> </dependency> -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>

		<!-- jstl -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- shiro -->
		<!-- apache shiro dependencies -->
		<!-- <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> 
			<version>${shiro.version}</version> </dependency> -->


		<!-- spring -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.6.8</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- struts2 begin -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>${struts2.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>javassist</artifactId>
					<groupId>javassist</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>${struts2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-json-plugin</artifactId>
			<version>${struts2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-convention-plugin</artifactId>
			<version>${struts2.version}</version>
		</dependency>
		<!-- struts2 end -->

		<!-- hibernate begin -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.2.1.Final</version>
		</dependency>
		<!-- hibernate end -->

		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>${c3p0.version}</version>
		</dependency>

		<!-- <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> 
			<version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> 
			<artifactId>cxf-rt-transports-http</artifactId> <version>${cxf.version}</version> 
			</dependency> -->

		<!-- log start -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<!-- log end -->

		<!-- Javamail -->
		<!-- <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> 
			<version>1.4.4</version> </dependency> -->

		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>

		<dependency>
			<groupId>org.codehaus.xfire</groupId>
			<artifactId>xfire-core</artifactId>
			<version>1.2.6</version>
		</dependency>

		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6</version>
		</dependency>

		<!-- <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> 
			<version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> 
			<artifactId>poi-ooxml</artifactId> <version>3.11</version> </dependency> 
			<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> 
			<version>3.11</version> </dependency> -->

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>net.sf.ehcache</groupId>
			<artifactId>ehcache-core</artifactId>
			<version>2.6.6</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>sshtest</finalName>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.2</version>
					<configuration>
						<source>1.7</source>
						<target>1.7</target>
						<encoding>UTF-8</encoding>
						<showWarnings>true</showWarnings>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

2.2、建立maven-dao子模組

    

點next進入如下圖

      
點選next,如下圖
      
點選finish,完成,檢視父工程中的pom.xml檔案
        
檢視ssh_dao中的pom.xml檔案,會發現多了一個 parent結點,並且內部所包含的結點,其實就是父工程的座標

        

檢視ssh_dao的目錄結構

        

因為是在dao層,和資料庫打交道,那麼就在這個專案中,需要配置hibernate.hbm.xml和hibernate.cfg.xml,但是又集成了spring,所以hibernate.cfg.xml就不需要了,新增applicationContext.xml即可(這裡需要有spring整合hibernate的基礎)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2.3、建立ssh_service子模組

    方法同ssh_dao模組建立方法一樣,模組名稱為ssh_service。

    看ssh_service和ssh_parent的pom.xml檔案,會出現和ssh_dao建立時一樣的情況,ssh_service多出一個parents結點,ssh_parent多個一個module結點

            

            

在ssh_service的pom.xml中新增兩個依賴

            

。。。。。。。。。。。。。。。。。。。。

2.4、建立ssh_web子模組

         方法同maven-dao模組建立方法,模組名稱為ssh-web,注意:打包方式為war,而不再是jar包了,因為該層需要放到tomcat中去。與瀏覽器互動,就是web專案了,所以打成war包

    和前面一樣,ssh_parent的pom.xml中增加一個module結點,而ssh_web的pom.xml中增加一個parent結點

    這個也很簡單,就是跟寫普通的struts2是一樣的,只不過是和spring的結合,有什麼物件,都通過spring來給予,並且這裡多做一個事情,就是將之前的applicationContext配置檔案進行結合,看下圖

。。。。。。。。。。。。。。。。

2.5、總結與啟動

         父工程和子模組都寫完之後,就成這樣了
 

三、總結

      理解了這個分模組與聚合的作用,並且知道如何開發即可。加油。確實搞的有點煩躁。