springboot创建父子工程、聚合工程

开发工具:IntellJ IDEA 2017

springboot创建父子工程、聚合工程及搭建框架过程中遇到的问题解决

项目名称

wyait父工程【父】:wyait-parent(用于统一依赖版本管理)
wyait通用工程【子】:wyait-common(统一保存通用工具类)
wyait-web工程【子】:wyait-web(聚合工程)

项目框架简述

wyait-web 项目框架设计简述:

  • wyait-web-pojo:保存pojo和entity实体类;
  • wyait-web-dao:数据访问层,与底层 MySQL进行数据交互(依赖pojo);
  • wyait-web-service:相对具体的业务逻辑服务层(依赖mapper/pojo);
  • wyait-web-controller:对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等(依赖service/pojo);
  • wyait-web-webapp:项目启动Application类、配置类、静态资源文件(依赖controller/pojo)。

项目源码

github:https://github.com/wyait/web.git
码云:https://gitee.com/wyait/web.git

注意,源码中没有提交空白目录,有些src/main/java/、src/main/resources/等目录需要大家手动创建!!!

初始技术依赖包括:

  • springboot
  • spring
  • mybatis
  • thymeleaf模版
  • redis
  • httpclient
  • oval校验
  • commons包
  • devTools热部署
  • 静态资源配置(详见:MyWebMvcConfig类)
  • druid数据库连接池
  • pagehelper分页
  • log4j2

静态资源配置说明

MyWebMvcConfig类片段:

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(“/css/**”).addResourceLocations(“/css/”);
        registry.addResourceHandler(“/images/**”).addResourceLocations(“/images/”);
        registry.addResourceHandler(“/js/**”).addResourceLocations(“/js/”);
        //配置中的file:表示是一个具体的硬盘路径,其他的配置指的是系统环境变量
        registry.addResourceHandler(“/img/**”).addResourceLocations(“file:D:/demo-images/”);
        super.addResourceHandlers(registry);
    }
  • 把0.jpg图片放到D:/demo-images/路径下,启动项目,访问:
    http://127.0.0.1:8099/img/0.jpg
    显示图片,配置ok。

  • 其他静态文件,样式、图片、js等均可直接访问。
  • 注释的代码,是拦截器的配置;
  • 过滤器、监听器等配置实现,参考博客:
    spring boot 整合redis、拦截器、过滤器、监听器、静态资源配置:https://blog.51cto.com/wyait/1971108。

注意:使用IntellJ IDEA开发工具时,有个问题,见文末。

RedisUtil

redis的使用,参考wyait-common项目中RedisUtil类中的API方法;
参考博客:
spring boot 1.5.9 整合redis:https://blog.51cto.com/wyait/2048478

HttpService

httpClient操作,参考midd-common项目中HttpService类中的API方法,结果封装在HttpResult类中

搭建项目框架

wyait-parent(版本管理)

每个平台都有一个parent项目,用于项目依赖版本统一管理

创建wyait-parent项目

  • File-->new project-->maven:
    springboot创建父子工程、聚合工程及问题解决_第1张图片
  • next:输入maven坐标;
  • next:Project name: wyait-parent
  • Finish
  • 删除src/目录。

项目结构如下:
springboot创建父子工程、聚合工程及问题解决_第2张图片

导入依赖

注意:

  1. springboot在创建单应用项目的时候,有默认的依赖;我们在自定义wyait-parent项目时,如果直接以springboot的parent作为wyait-parent项目的父依赖管理的话,子项目会由于存在两个parent而报错,无法导入依赖。
    解决方案如下:

    org.springframework.boot
    spring-boot-dependencies
    ${spring.boot.version}
    pom
    import

使用spring-boot-dependencies依赖对springboot的依赖包进行统一管理。

  1. maven项目的pom中的标签的含义,自行google、百度了解 //TODO
... ...

    com.wyait.parent
    wyait-parent
    1.0.0
    pom

    
        
        UTF-8
        UTF-8
        
        1.7
        
        4.3.13.RELEASE
        
        1.5.9.RELEASE
        1.3.1
        1.1.5
        1.2.3
        3.6
        2.5
        1.86
    
    
    
        
            
            
                org.springframework
                spring-framework-bom
                ${springframework.version}
                pom
                import
            
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring.boot.version}
                pom
                import
            
           ...
        
    

    
    
        
            
                maven-compiler-plugin
                
                
                    1.7
                    1.7
                
            
        
    

wyait-common(通用工具类项目)

用于存放通用的工具类;
wyait-common项目,统一保存通用工具类
涉及到bean注入,需要在wyait-web的Application启动类中,添加注解:

@SpringBootApplication
//@ComponentScan用于配置扫描com.wyait.web之外的包下面的类
@ComponentScan(basePackages={"com.wyait"})
public class WyaitWebApplication {

    public static void main(String[] args) {
        SpringApplication sa=new SpringApplication(WyaitWebApplication.class);
        // 禁用devTools热部署
        //System.setProperty("spring.devtools.restart.enabled", "false");
        // 禁用命令行更改application.properties属性
        sa.setAddCommandLineProperties(false);
        sa.run(args);
    }
}

创建wyait-common

方法和创建wyait-parent一致,注意不删除src。

pom依赖


    
        com.wyait.parent
        wyait-parent
        1.0.0
    

    com.wyait.common
    wyait-common
    1.0.0
    jar

    
       ...
       
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

wyait-web聚合工程

本demo为了方便,前期所有第三方依赖统一加在pom工程里面。比如:都放在wyait-web的pom文件中。上线前,再统一做调整,分别配置依赖。
建议前期就分配module各项目需要的依赖,避免引入不必要的。

创建wyait-web

操作和创建wyait-common一致。

pom依赖

  1. 项目内版本管理,通过配置properties实现;
  2. 引入通用工具项目wyait-common;
  3. 解决项目启动后,webapp/资源目录编译之后访问不到的问题。
...

    com.wyait.web
    wyait-web
    ${wyait.web.version}
    pom
    
        com.wyait.parent
        wyait-parent
        1.0.0
    
     
    
    

    
        
        1.0.0
        1.0.0
    

    
        
        
            com.wyait.common
            wyait-common
            ${wyait.common.version}
        

        ...
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
        
        
            
                src/main/webapp
                
                META-INF/resources
                
                    **/**
                
            
            
                src/main/resources
                true
                
                    **/*
                
            
        
    

创建wyait-web-pojo

选中pom项目wyait-web,右键:new --> module --> maven :

springboot创建父子工程、聚合工程及问题解决_第3张图片

finish。

项目结构:
springboot创建父子工程、聚合工程及问题解决_第4张图片

pom依赖

 
        wyait-web
        com.wyait.web
        1.0.0
    
    4.0.0

    com.wyait.web.pojo
    wyait-web-pojo
    ${wyait.web.version}
    jar

创建wyait-web-service、wyait-web-dao、wyait-web-controller项目一样。pom依赖根据依赖关系,自行调整,详见源码。

创建wyait-web-webapp

方式一

第一种,创建方式和wyait-web-pojo一样;

创建项目完成后,另外需要几步操作:

  1. 新建src/main/webapp/文件目录,用于存放静态资源文件和页面;
  2. src/main/java/目录下,新建包com.wyait.web和com.wyait.web.config,存放springboot启动Application类和相关配置类;
  3. src/main/resources/目录下,保存application.properties、log4j2.xml等配置文件。
    wyait-web-webapp项目架构如下:
    springboot创建父子工程、聚合工程及问题解决_第5张图片

注意:这里WEB-INF/下面多了一个web.xml文件,或在pom文件中添加一个maven-war-plugin插件配置,下文会说明原因。

方式二

第二种,在选择maven的时候,选中:Create from archetype,找到:maven-archetype-webapp,创建webapp项目;
然后调整项目结构和依赖和方式一一致即可。//TODO

方式三

第三种,New --> project --> Spring Initializr创建springboot项目 --> 调整项目结构和依赖和上面保持一致即可。//TODO

测试

新建controller类、静态文件和页面,详见源码!

启动测试:

http://127.0.0.1:8099/home
springboot创建父子工程、聚合工程及问题解决_第6张图片

IndexController中有midd-common项目中通用工具类的测试,也可自行编写测试
其他技术依赖。//TODO

项目安全

  1. 用户登录后,设置的cookie值token必须加密处理;
  2. API接口安全,涉及用户相关模块的操作,后台会校验token;也可参考博客:java接口安全:https://blog.51cto.com/wyait/1920134;
  3. 防止xss、sql注入等,后期统一处理。

项目检出

eclipse

  1. 以eclipse为例,找到SVN资源库,输入SVN地址,checkout:
  2. 检出后,查看项目结构如下:
    springboot创建父子工程、聚合工程及问题解决_第7张图片
  3. 选中其中的module项目,右键 --> import:
    springboot创建父子工程、聚合工程及问题解决_第8张图片
    选择:Existing Maven Projects --> next --> finish;

就会导出module模块wyait-web-controller,其他模块操作一样。

  1. 运行:
    在wyait-web-webapp项目src/main/java/com/wyait/web/目录下,使用 WyaitWebApplication类中的main方法启动项目。
    也可配置tomcat启动,注意项目路径。//TODO

IntellJ IDEA

相比eclipse简单一些,主要在check out过程中,要注意聚合项目的目录层级结构(平行结构、父子结构)。//TODO

开发工具不同遇到的问题

eclipse和IntellJ IDEA开发工具不同遇到的问题。
使用IntellJ IDEA,必须在依赖中添加以下配置:

  1. 使用IDEA开发工具时,需要在wyait-web目录下,新建src/main/java、src/main/resources空白目录,否则启动时报错:
Caused by: java.lang.IllegalArgumentException: Folder 'D:\wyaitWorkspace\wyait-web\src\main\resources' must exist and must be a directory

加上即可解决;

  1. 使用IDEA开发工具时,注释下面的依赖:

            
  1. 使用IDEA开发时,为了配置静态资源文件放在webapp目录下,需要新增如下配置:

    
        
            src/main/webapp
            
            META-INF/resources
            
                **/**
            
        
        
            src/main/resources
            true
            
                **/*
            
        
    

项目package时的问题

wyait-web-webapp要打包为war时,项目src/main/webapp/WEB-INF/目录下,如果没有web.xml文件,打包会报错:找不到WEB-INF/web.xml.

... ...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.266 s
[INFO] Finished at: 2018-07-18T11:37:05+08:00
[INFO] Final Memory: 19M/184M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project mdd-admin: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 

解决方案

方案一:在项目WEB-INF/目录下新建一个web.xml文件,用于项目package时使用,无其他用途。
web.xml文件不需要增加任何配置,内容如下:




  Archetype Created Web Application

方案二【推荐】:在pom.xml中添加依赖:
注意Failed失败中,maven-war-plugin的版本为2.2。所以pom中配置的插件版本要对应一样。


    org.apache.maven.plugins
    maven-war-plugin
    2.2
    
        false