六、构建多模块Maven工程(重点)

Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。

拆分规则:

(1)按业务模块拆分

maven多模块relative maven多模块版本管理_xml

 

(2)按层拆分

maven多模块relative maven多模块版本管理_xml_02

创建Maven父工程(erp_parent)

(一)创建Maven父工程

 

maven多模块relative maven多模块版本管理_maven多模块relative_03


 

maven多模块relative maven多模块版本管理_xml_04


 

maven多模块relative maven多模块版本管理_maven_05


 

maven多模块relative maven多模块版本管理_maven_06

注意:打包方式选择pom

maven多模块relative maven多模块版本管理_maven_07

工程创建完成,后打开pom.xml ,添加一下内容


<properties>

    <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 

maven多模块relative maven多模块版本管理_xml_08

 

maven多模块relative maven多模块版本管理_maven多模块relative_09

maven多模块relative maven多模块版本管理_maven_10

一共需要建立4个子模块

erp_domain存放实体包

erp_dao  存放数据访问接口及实现类

erp_service   存放业务逻辑层接口及实现类

erp_web  存放action类代码和前端代码  (注意:此模块的packaging选择war)

maven多模块relative maven多模块版本管理_xml_11

在erp_web 工程中展开src\main\webapp目录,建立WEB-INF文件夹,并将web.xml拷贝到文件夹中。

maven多模块relative maven多模块版本管理_xml_12

将struts2和spring配置文件放入erp_web 的 src/main/resources 下面

maven多模块relative maven多模块版本管理_spring_13

 

构建完各个模块后,会发现父工程的pom.xml中自动出现如下信息:



<modules>

    <module>erp_domain</module>

    <module>erp_dao</module>

    <module>erp_service</module>

    <module>erp_web</module>

  </modules>



这部分的配置信息是父工程聚合子模块的信息

而子模块的pom.xml内容如下:



<projectxmlns="http:///POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">

  <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下。

maven多模块relative maven多模块版本管理_xml_14

将cn.itcast.mavenweb.dao和cn.itcast.mavenweb.dao.impl 下的接口和类都拷贝到erp_dao工程。

maven多模块relative maven多模块版本管理_spring_15

为什么出红叉了呢?这是因为数据访问层会用到实体类。而erp_dao工程是没有实体类的,实体类在erp_domain工程中,这就需要建立工程之间的依赖。

 

各模块的依赖关系如下:

erp_dao 依赖erp_domain

erp_service 依赖erp_dao

erp_web依赖erp_service

我们现在建立erp_dao和erp_domain的依赖:

工程右键  Maven -->  Add Dependency

maven多模块relative maven多模块版本管理_spring_16

步骤与添加依赖jar包类似,操作后erp_dao红叉消失

maven多模块relative maven多模块版本管理_xml_17

erp_dao的pom.xml内容如下:



<dependencies>

    <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 用于配置数据源信息


 

<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>

        <propertyname="url"value="jdbc:mysql://127.0.0.1:3306/erpdb?useUnicode=true&characterEncoding=UTF8"/>

        <propertyname="username"value="root"/>

        <propertyname="password"value="123456"/>

    </bean>

        

    <beanid="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

        <propertyname="dataSource"ref="dataSource"/>

        <propertyname="hibernateProperties">

            <props>

                <propkey="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>

                <propkey="hibernate.show_sql">true</prop>

                <propkey="hibernate.format_sql">false</prop>

            </props>

        </property>

        <propertyname="mappingLocations">

            <value>classpath:cn/itcast/mavenweb/domain/*.hbm.xml</value>

        </property>

    </bean>


   



 

创建applicationContext_dao.xml 用于存放所有的dao类的bean



<beanid="depDao"class="cn.itcast.mavenweb.dao.impl.DepDaoImpl">

        <propertyname="sessionFactory"ref="sessionFactory"></property>

    </bean>



 

(2)在erp_service工程下创建applicationContext_tx.xml,用于配置声明式事务相关配置信息



<beanid="transactionManager"class="org.springframework.orm.hibernate5.HibernateTransactionManager">

        <propertyname="sessionFactory"ref="sessionFactory"/>

    </bean>

        

    <tx:adviceid="advice"transaction-manager="transactionManager">

        <tx:attributes>        

          <tx:methodname="do*"propagation="REQUIRED"/>

          <tx:methodname="add*"propagation="REQUIRED"/>

          <tx:methodname="update*"propagation="REQUIRED"/>

          <tx:methodname="save*"propagation="REQUIRED"/>

          <tx:methodname="delete*"propagation="REQUIRED"/>

          <tx:methodname="*"read-only="true"/>

        </tx:attributes>

    </tx:advice>

    

    <aop:config>

        <aop:pointcutid="serviceMethod"expression="execution(* cn.itcast.mavenweb.service.impl.*.*(..))"/>

        <aop:advisorpointcut-ref="serviceMethod"advice-ref="advice"/>

    </aop:config>

   



 

编写applicationContext_service.xml 用于配置所有的业务逻辑层信息



<beanid="depService"  class="cn.itcast.mavenweb.service.impl.DepServiceImpl">

        <propertyname="depDao"ref="depDao"></property>

    </bean>



 

 

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



<beanid="depAction"class="cn.itcast.mavenweb.web.action.DepAction">

        <propertyname="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路径)进行查找.