六、构建多模块Maven工程(重点)
六、构建多模块Maven工程(重点)
Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。
拆分规则:
(1)按业务模块拆分
(2)按层拆分
创建Maven父工程(erp_parent)
(一)创建Maven父工程
注意:打包方式选择pom
工程创建完成,后打开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
一共需要建立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
http://maven.apache.org/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下。
将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> <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路径)进行查找.