1. 程式人生 > >項目管理工具Maven4

項目管理工具Maven4

項目管理工具Maven4

五、聚合與繼承(一)聚合
隨著技術的飛速發展和各類用戶對軟件的要求越來越高,軟件本身也變得越來越復雜,然後軟件設計人員開始采用各種方式進行開發,於是就有了我們的分層架構、分模塊開發,來提高代碼的清晰和重用。針對於這一特性,maven也給予了相應的配置。
我們在開發過程中,創建了2個以上的模塊,每個模塊都是一個獨立的maven project,在開始的時候我們可以獨立的編譯和測試運行每個模塊,但是隨著項目的不斷變大和復雜化,我們期望能夠使用簡單的操作來完成編譯等工作,這時Maven給出了聚合的配置方式。
所謂聚合,顧名思義,就是把多個模塊或項目聚合到一起,我們可以建立一個專門負責聚合工作的Maven 工程。
建立該project的時候,我們要註意以下幾點:
1.聚合模塊本身也做為一個Maven項目,它必須有自己的POM
2.它的打包方式必須為: pom
3.引入了新的元素:modules---module
4.版本:聚合模塊的版本和被聚合模塊版本一致
5.相對目錄:每個module的值都是一個當前POM的相對目錄
6.目錄名稱:為了方便的快速定位內容,模塊所處的目錄應當與其artifactId一致(Maven約定而不是硬性要求),總之,模塊所處的目錄必須和<module>模塊所處的目錄</module>相一致。
7.習慣約定:為了方便構建,通常將聚合模塊放在項目目錄層的最頂層,其它聚合模塊作為子目錄存在。這樣當我們打開項目的時候,第一個看到的就是聚合模塊的POM
8.聚合模塊減少的內容:聚合模塊的內容僅僅是一個pom.xml文件,它不包含src/main/Java、src/test/java等目錄,因為它只是用來幫助其它模塊構建的工具,本身並沒有實質的內容。
9.聚合模塊和子模塊的目錄:他們可以是父子類,也可以是平行結構,當然如果使用平行結構,那麽聚合模塊的POM也需要做出相應的更改。
(二)繼承
我們在項目開發的過程中,可能多個模塊獨立開發,但是多個模塊可能依賴相同的元素,比如說每個模塊都需要Junit,使用spring的時候,其核心jar也必須都被引入,在編譯的時候,maven-compiler-plugin插件也要被引入。這時我們采用繼承,就不用在每個子模塊分別定義了。
如何配置繼承:
1.說到繼承肯定是一個父子結構,那麽我們在父工程中來創建一個parent project
2.<packaging>: 作為父模塊的POM,其打包類型也必須為POM
3.結構:父模塊只是為了幫助我們消除重復,所以它也不需要src/main/java、src/test/java等目錄
4.新的元素:<parent> , 它是被用在子模塊中的
5.<parent>元素的屬性:<relativePath>: 表示父模塊POM的相對路徑,在構建的時候,Maven會先根據relativePath檢查父POM,如果找不到,再從本地倉庫查找
6.relativePath的默認值: ../pom.xml
7.子模塊省略groupId和version: 使用了繼承的子模塊中可以不聲明groupId和version, 子模塊將隱式的繼承父模塊的這兩個元素
(三)聚合與繼承的區別
聚合和繼承通常是結合使用的,但是其作用是不同的。聚合是將多個模塊的工程匯聚到一起,而繼承則是指明某個模塊工程要繼承另一個模塊功能。
技術分享圖片
六、構建多模塊Maven工程(重點)
Maven多模塊項目,適用於一些比較大的項目,通過合理的模塊拆分,實現代碼的復用,便於維護和管理。尤其是一些開源框架,也是采用多模塊的方式,提供插件集成,用戶可以根據需要配置指定的模塊。
拆分規則:
(1)按業務模塊拆分
技術分享圖片
(2)按層拆分
技術分享圖片
創建Maven父工程(erp_parent)
(一)創建Maven父工程
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

註意:打包方式選擇pom
技術分享圖片

工程創建完成,後打開pom.xml ,添加一下內容

<properties>[/align]          <hinernate.version>5.0.7.Final</hinernate.version>
          <spring.version>4.2.4.RELEASE</spring.version>
          <struts.version>2.3.24</struts.version>
  </properties>

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

          <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>${hinernate.version}</version>
          </dependency>
          <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</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-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.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.7.4</version>
          </dependency>
          <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-core</artifactId>
          <version>${struts.version}</version>
          <exclusions>
          <exclusion>
          <groupId>javassist</groupId>
          <artifactId>javassist</artifactId>
          </exclusion>
          </exclusions>
          </dependency>
          <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-spring-plugin</artifactId>
          <version>${struts.version}</version>
          </dependency>
          <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.6</version>
          </dependency>

          <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
          </dependency>
  </dependencies>

  <build> 
  <plugins>
      <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-compiler-plugin</artifactId> 
          <version>2.3.2</version> 
          <configuration> 
              <source>1.7</source> 
              <target>1.7</target> 
          </configuration> 
      </plugin>
  </plugins>          
  </build>

(二)創建Maven子模塊
選擇菜單file -- new -- other
技術分享圖片
技術分享圖片
技術分享圖片

一共需要建立4個子模塊
erp_domain 存放實體包
erp_dao 存放數據訪問接口及實現類
erp_service 存放業務邏輯層接口及實現類
erp_web 存放action類代碼和前端代碼 (註意:此模塊的packaging選擇war)
技術分享圖片
在erp_web 工程中展開src\main\webapp目錄,建立WEB-INF文件夾,並將web.xml拷貝到文件夾中。
技術分享圖片
將struts2和spring配置文件放入erp_web 的 src/main/resources 下面
技術分享圖片
構建完各個模塊後,會發現父工程的pom.xml中自動出現如下信息:

<modules>
        <module>erp_domain</module>
        <module>erp_dao</module>
        <module>erp_service</module>
        <module>erp_web</module>
</modules>

這部分的配置信息是父工程聚合子模塊的信息
而子模塊的pom.xml內容如下:


<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 [url=http://maven.apache.org/xsd/maven-4.0.0.xsd]http://maven.apache.org/xsd/maven-4.0.0.xsd[/url]">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.itcast.erp</groupId>
    <artifactId>erp_parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>erp_domain</artifactId>
</project>

(三)建立Maven子模塊之間的依賴
我們將剛才我們的mavenweb工程的代碼分別拷貝到各自的子模塊:
將cn.itcast.mavenweb.domain包下的類拷貝到erp_domain的src/main/java下,將cn.itcast.mavenweb.domain下的映射文件拷貝到erp_domain的src/main/resources下。
技術分享圖片
將cn.itcast.mavenweb.dao和cn.itcast.mavenweb.dao.impl 下的接口和類都拷貝到erp_dao工程。
技術分享圖片
為什麽出紅叉了呢?這是因為數據訪問層會用到實體類。而erp_dao工程是沒有實體類的,實體類在erp_domain工程中,這就需要建立工程之間的依賴。
各模塊的依賴關系如下:
erp_dao 依賴erp_domain
erp_service 依賴erp_dao
erp_web依賴erp_service
我們現在建立erp_dao和erp_domain的依賴:
工程右鍵 Maven --> Add Dependency
技術分享圖片
步驟與添加依賴jar包類似,操作後erp_dao紅叉消失
技術分享圖片
erp_dao的pom.xml內容如下:


<dependencies>[/align]          <dependency>
          <groupId>cn.itcast.erp</groupId>
          <artifactId>erp_domain</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          </dependency>
  </dependencies>

按照同樣的方法建立其它的工程依賴
(四)代碼編寫
(1)將cn.itcast.mavenweb.service和cn.itcast.mavenweb.service.impl下的接口和類拷貝到erp_service工程下。
(2)將cn.itcast.mavenweb.web.action下的類拷貝到erp_web工程下,將applicationContext.xml和struts.xml拷貝到erp_web工程的src/main/resources 目錄下,將index.jsp拷貝到webapp目錄下。
(五)配置文件拆分
(1)在erp_dao工程下創建applicationContext_datasource.xml 用於配置數據源信息

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/erpdb?useUnicode=true&characterEncoding=UTF8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
<property name="mappingLocations">
<value>classpath:cn/itcast/mavenweb/domain/*.hbm.xml</value>
</property>
</bean>

創建applicationContext_dao.xml 用於存放所有的dao類的bean

<bean id="depDao" class="cn.itcast.mavenweb.dao.impl.DepDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

(2)在erp_service工程下創建applicationContext_tx.xml,用於配置聲明式事務相關配置信息

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
    <tx:attributes>            
      <tx:method name="do*" propagation="REQUIRED"/>
      <tx:method name="add*" propagation="REQUIRED"/>
      <tx:method name="update*" propagation="REQUIRED"/>
      <tx:method name="save*" propagation="REQUIRED"/>
      <tx:method name="delete*" propagation="REQUIRED"/>
      <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethod" expression="execution(* cn.itcast.mavenweb.service.impl.*.*(..))"/>
<aop:advisor pointcut-ref="serviceMethod" advice-ref="advice" />
</aop:config>

編寫applicationContext_service.xml 用於配置所有的業務邏輯層信息

<bean id="depService"  class="cn.itcast.mavenweb.service.impl.DepServiceImpl">
<property name="depDao" ref="depDao"></property>
</bean>

(3)在erp_web工程下創建applicationContext_web.xml

<bean id="depAction" class="cn.itcast.mavenweb.web.action.DepAction">
<property name="depService" ref="depService"></property>
</bean>

(六)運行測試及打包
選擇erp_parent工程,執行命令package 進行打包(war)
這裏我們需要註意一點,我們在將配置文件分到每個子模塊後,打成的war包中不並包括其它jar工程的配置文件,這些jar工程的配置文件被直接打到jar包中,這時web.xml中下列配置就可以找到這些jar包中的配置文件:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>

classpath 和 classpath 區別:
classpath:只會到你指定的class路徑中查找找文件;
classpath
:不僅包含class路徑,還包括jar文件中(class路徑)進行查找.

項目管理工具Maven4