迎着风跑  

一、子父工程之间的关系

  • 父工程与子模块之间是继承关系,子模块天生就能使用父工程中的内容

  • 子模块与子模块之间是依赖关系,需要程序员手动在pom中指定

  • 编写规则

    所有子模块都需要的功能配置到父工程中
    只有某一个子模块需要的功能,单独配置到自己的模块中
    子模块之间的依赖关系存在传递性

二、搭建子父工程

1、搭建子父工程项目结构

  • 创建maven父工程 (maven 控制台)


    父工程中删除src目录,只保留pom.xml
  • 在父工程中创建 dao 子模块(mave控制台 dao+entity)


    打包方式为jar
  • 在父工程中创建service 子模块(mave控制台 )


    打包方式为jar
  • 在父工程中创建web子模块(mave web)


    打包方式为war包

2、配置子模块之间的依赖关系

在对应子模块的pom.xml中进行依赖,子模块与子模之间是通过打包后的jar包引用来进行依赖的


示例:
   <dependencies>
       <!--配置service依赖的dao模块-->
       <dependency>
           <groupId>cn.woniu</groupId>
           <artifactId>book-dao</artifactId>
           <version>1.0-SNAPSHOT</version>
       </dependency>
   </dependencies>

 

3、dao模块编写

  • 在父工程中配置公共的坐标

    <?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">
       <modelVersion>4.0.0</modelVersion>
       <groupId>cn.woniu</groupId>
       <artifactId>book-par</artifactId>
       <packaging>pom</packaging>
       <version>1.0-SNAPSHOT</version>
       <modules>
           <module>book-dao</module>
           <module>book-service</module>
           <module>book-web</module>
       </modules>

       <dependencies>
           <!--junit-->
           <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>4.12</version>
               <scope>provided</scope>
           </dependency>
           <!--lombok-->
           <dependency>
               <groupId>org.projectlombok</groupId>
               <artifactId>lombok</artifactId>
               <version>1.18.20</version>
               <scope>provided</scope>
           </dependency>

           <!--日志-->
           <dependency>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-api</artifactId>
               <version>1.7.30</version>
           </dependency>
           <dependency>
               <groupId>ch.qos.logback</groupId>
               <artifactId>logback-core</artifactId>
               <version>1.2.3</version>
           </dependency>
           <dependency>
               <groupId>ch.qos.logback</groupId>
               <artifactId>logback-classic</artifactId>
               <version>1.2.3</version>
           </dependency>

           <!--spring相关包-->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-context</artifactId>
               <version>5.0.9.RELEASE</version>
           </dependency>
           <!--spring整合junit包-->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-test</artifactId>
               <version>5.0.9.RELEASE</version>
           </dependency>

           <!--cglib-->
           <dependency>
               <groupId>cglib</groupId>
               <artifactId>cglib</artifactId>
               <version>3.3.0</version>
           </dependency>
           <!--spring aop-->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-aspects</artifactId>
               <version>5.0.9.RELEASE</version>
           </dependency>
           <!--spring事务-->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-tx</artifactId>
               <version>5.0.9.RELEASE</version>
           </dependency>
           
            <!--pageHelper分页插件-->
           <dependency>
               <groupId>com.github.pagehelper</groupId>
               <artifactId>pagehelper</artifactId>
               <version>5.2.0</version>
           </dependency>
       </dependencies>

       <!--配置maven插件-->
       <build>
           <plugins>
               <!--配置maven的编译插件-->
               <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-compiler-plugin</artifactId>
                   <version>3.5.1</version>
                   <configuration>
                       <target>1.8</target>  <!-- 源代码使用的开发版本 -->
                       <source>1.8</source>  <!-- 需要生成的目标class文件的编译版本 -->
                       <encoding>UTF-8</encoding>
                   </configuration>
               </plugin>
           </plugins>

           <!--解决maven项目不加载静态资源-->
           <resources>
               <resource>
                   <directory>${basedir}/src/main/java</directory>
                   <includes>
                       <include>**/*.xml</include>
                   </includes>
               </resource>
               <resource>
                   <directory>${basedir}/src/main/resources</directory>
                   <includes>
                       <include>**/*.xml</include>
                       <include>**/*.properties</include>
                   </includes>
               </resource>
           </resources>
       </build>
    </project>
  • 配置dao所需的坐标


    <?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>
           <artifactId>book-par</artifactId>
           <groupId>cn.woniu</groupId>
           <version>1.0-SNAPSHOT</version>
       </parent>
       <modelVersion>4.0.0</modelVersion>
       <packaging>jar</packaging>
       <artifactId>book-dao</artifactId>

       <dependencies>
           <!--mysql驱动-->
           <dependency>
               <groupId>mysql</groupId>
               <artifactId>mysql-connector-java</artifactId>
               <version>8.0.22</version>
           </dependency>
           <!--mybaits-->
           <dependency>
               <groupId>org.mybatis</groupId>
               <artifactId>mybatis</artifactId>
               <version>3.4.6</version>
           </dependency>


           <!--mybatis generator坐标-->
           <dependency>
               <groupId>org.mybatis.generator</groupId>
               <artifactId>mybatis-generator-core</artifactId>
               <version>1.3.7</version>
           </dependency>

           <!--druid-->
           <dependency>
               <groupId>com.alibaba</groupId>
               <artifactId>druid</artifactId>
               <version>1.2.5</version>
           </dependency>


           <!--spring jdbc整合包-->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-jdbc</artifactId>
               <version>5.0.9.RELEASE</version>
           </dependency>
           <!--mybatis与spring整合包-->
           <dependency>
               <groupId>org.mybatis</groupId>
               <artifactId>mybatis-spring</artifactId>
               <version>2.0.1</version>
           </dependency>
       </dependencies>

       <build>
           <plugins>
               <!--mybatis generator自动生成配置-->
               <plugin>
                   <groupId>org.mybatis.generator</groupId>
                   <artifactId>mybatis-generator-maven-plugin</artifactId>
                   <version>1.3.7</version>
                   <configuration>
                       <!--配置文件的位置-->
                       <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                       <verbose>true</verbose>
                       <overwrite>true</overwrite>
                   </configuration>
                   <dependencies>
                       <dependency>
                           <groupId>mysql</groupId>
                           <artifactId>mysql-connector-java</artifactId>
                           <version>8.0.22</version>
                       </dependency>
                   </dependencies>
               </plugin>
           </plugins>
       </build>
    </project>
  • 配置dao中需要的静态资源


    db.properties   generatorConfig.xml   logback.xml
  • 配置在dao子模块中配置spring配置类


    DataBaseConfig

​ 编写dao模块的spring配置类


/**
* Spring dao模块的配置文件
*/
@Configuration
@ComponentScan(basePackages = {"cn.woniu.dao"})
@Import(value = {DataBaseConfig.class})
public class SpringDaoConfig {

   /**
    * 配置数据源
    * @param dataBase
    * @return
    */
   @Bean(name="dataSource",initMethod = "init",destroyMethod = "close")
   public DruidDataSource druidDataSource(DataBaseConfig dataBase){
       DruidDataSource dataSource=new DruidDataSource();
       dataSource.setDriverClassName(dataBase.getDriverName());
       dataSource.setUrl(dataBase.getUrl());
       dataSource.setUsername(dataBase.getUserName());
       dataSource.setPassword(dataBase.getPassword());
       return dataSource;
  }

   /**
    * 配置mybaits的会话工厂
    * @param dataSource
    * @return
    */
   @Bean
   public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
       SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
       factoryBean.setDataSource(dataSource);

       /*配置pageHelper插件*/
       PageInterceptor pageInterceptor=new PageInterceptor();
       //封装PageInterceptor插件所需的属性对象
       Properties properties=new Properties();
       properties.setProperty("helperDialect","mysql");
       properties.setProperty("reasonable","true");
       pageInterceptor.setProperties(properties);

       //将PageInterceptor插件对象,添加到SqlSessionFactoryBean中
       factoryBean.setPlugins(new Interceptor[]{pageInterceptor});
       return factoryBean;
  }

   /**
    * 配置mybaits扫描dao接口
    * @return
    */
   @Bean
   public MapperScannerConfigurer mapperScannerConfigurer(){
       MapperScannerConfigurer mapperScanner=new MapperScannerConfigurer();
       mapperScanner.setBasePackage("cn.woniu.dao");
       return mapperScanner;
  }
}

<font color=red>注意:当修改 一个子模块中的代码时一定要将该模块重新清理并打包,必须使用Intall将模块打包并发布本地仓库</font>

4、service模块编写

  • 编写service模块的spring配置


    /**
    * service部分的spring配置
    */
    @Configuration
    @ComponentScan(basePackages = {"cn.woniu.service.impl"})
    @EnableTransactionManagement //开启事务
    public class SpringService {

       /**
        * 配置事务管理器
        * @param dataSource
        * @return
        */
       @Bean
       public DataSourceTransactionManager transactionManager(DataSource dataSource){
           DataSourceTransactionManager transactionManager=new DataSourceTransactionManager();
           transactionManager.setDataSource(dataSource);
           return transactionManager;
      }
    }
  • 如果要编写测试方法,要读取dao的配置类否则无法获得数据源对象


    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {SpringDaoConfig.class, SpringServiceConfig.class})
    public class ServiceTest {

       @Autowired
       private IBookService bookService;

       @Test
       public void findTest(){
           List<Book> bookList=bookService.findBook();
           System.out.println(bookList.toString());
      }
    }

5、编写web模块

  • 导包


     <dependencies>
       <!--配置web依赖的service模块-->
       <dependency>
         <groupId>cn.woniu</groupId>
         <artifactId>book-service</artifactId>
         <version>1.0-SNAPSHOT</version>
       </dependency>

       <!--servlet坐标-->
       <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>servlet-api</artifactId>
         <version>2.5</version>
         <scope>provided</scope>
       </dependency>
       <!--jsp api坐标-->
       <dependency>
         <groupId>javax.servlet.jsp</groupId>
         <artifactId>jsp-api</artifactId>
         <version>2.0</version>
         <scope>provided</scope>
       </dependency>
       <!--jstl标签库-->
       <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>jstl</artifactId>
         <version>1.2</version>
       </dependency>
       <dependency>
         <groupId>taglibs</groupId>
         <artifactId>standard</artifactId>
         <version>1.1.2</version>
         <scope>provided</scope>
       </dependency>

       <!--spring web-->
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-web</artifactId>
         <version>5.0.9.RELEASE</version>
       </dependency>
       <!--spring mvc-->
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-webmvc</artifactId>
         <version>5.0.9.RELEASE</version>
       </dependency>

       <!--springmvc 需要的json相关坐标-->
       <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.9.0</version>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-core</artifactId>
         <version>2.9.0</version>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-annotations</artifactId>
         <version>2.9.0</version>
       </dependency>

       <!--文件上传所需坐标-->
       <dependency>
         <groupId>commons-fileupload</groupId>
         <artifactId>commons-fileupload</artifactId>
         <version>1.4</version>
       </dependency>
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
         <version>2.10.0</version>
       </dependency>
     </dependencies>

     <build>
       <plugins>
         <!--maven tomcat插件-->
         <plugin>
           <groupId>org.apache.tomcat.maven</groupId>
           <artifactId>tomcat7-maven-plugin</artifactId>
           <version>2.2</version>
           <configuration>
             <!--请求路径-->
             <path>/</path>
             <!--指定端口-->
             <port>8080</port>
             <!--配置tomcat插件编码格式-->
             <uriEncoding>UTF-8</uriEncoding>
           </configuration>
         </plugin>
       </plugins>
     </build>
  • 创建springmvc配置文件

    和以前一样

  • 创建启动类


    /**
    * 项目启动类
    */
    public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

       /**
        * 读取spring配置类
        * @return
        */
       @Override
       protected Class<?>[] getRootConfigClasses() {
           return new Class[]{
                   SpringDaoConfig.class,
                   SpringServiceConfig.class
          };
      }

       /**
        * 读取springmvc配置类
        * @return
        */
       @Override
       protected Class<?>[] getServletConfigClasses() {
           return new Class[]{
                   SpringWebConfig.class
          };
      }

       /**
        * 配置springmvc控制器请求映射(controller要拦截哪些请求)
        * @return
        */
       @Override
       protected String[] getServletMappings() {
           return new String[]{"/"};
      }


       /**
        * springmvc中文乱码过滤器
        * @return
        */
       @Override
       protected Filter[] getServletFilters() {
           Filter  encodingFilter=new CharacterEncodingFilter("utf-8",true);
           return new Filter[]{encodingFilter};
      }
    }

三、maven工程中坐标版本冲突

1、依赖调解原则

  • 第一声明者优先

  • 路径近者优先原则

​ 这两个原则都需要根据路径选择

2、排除依赖【常用】

​ 在某个模块的pom.xml中声明不使用指定版本的坐标


<dependency>
     <groupId>com.woniu</groupId>
     <artifactId>maven-dao</artifactId>
     <version>1.0-SNAPSHOT</version>
     <exclusions>
         <exclusion>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
         </exclusion>
     </exclusions>
</dependency>

3、锁定坐标版本【常用】

在pom.xml中将版本号提取出来,使用<properties>标签设置成变量。


<properties>
       <junit-version>4.12</junit-version>
       <spring-version>5.0.9.RELEASE</spring-version>
   </properties>

 

posted on 2021-10-16 11:05  迎着风跑  阅读(641)  评论(0编辑  收藏  举报