JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系

参考:传智播客《电商项目-淘淘商城》

一、说明

本系列博客是对JavaWeb后台实战项目的一个总结和记录,项目来自于传智播客的《淘淘商城》项目,网上已经有不少博客介绍项目的情况,港真,这是一个比较容易获得的、贴近生产场景的例子,所以学习一下还是很有价值的,在学习过程中还可以作为自己的练手项目,在闲暇时光进行重构和升级(就是不知道多少程序员能够有不加班重构一份学习代码的时间~),如是。

项目Github地址:Zenhobby/alitymanager

二、Intellj Idea 2017

Intellj Idea是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、各类版本工具(git、svn、github等)、JUnit、CVS整合等方面超越了常用的Eclipse和Myeclipse这两个常用的Java IDE。作为一个份额远远低于Eclipse和Myeclipse的“小众软件”,具备强大高级特性和相对繁杂的快捷键的同时,Intellj Idea这个IDE却一直占据了IDE鄙视链的高端席位(当然这肯定不是此次选择Intellj Idea作为IDE的理由)。

经过一段时间的使用罗列一下Eclipse与Intellj Idea在使用中的差异(主要集中在这个项目中):

1. 多工程设置:Eclipse可以很方便创建和打开多个项目,在多个项目之间的跳转并无障碍,而Idea在设计上采用的是单工程设计,也就是说新创建一个工程的时候会关闭当前项目,打开一个新的项目(这一点并非不可规避,可以采用Module或者创建后打开为新窗口的方式达到打开多个项目的目的,这也是这篇博客的一个部分)。

2. 插件支持:Idea对插件的支持更加直观易用,简单说就是让一个新手更容易按照自己的设想找到工具应该在的地方,比如Maven、Tomcat和Git等,有些可以免除学习成本(这个只是主观感受)。

3. Project Structure:Project Structure是Idea独有的设置项,可以设置SDK、工程的源代码目录和依赖库等,逻辑抽象也更清晰了。

三、Maven聚合和继承

Maven用于工程管理时,一般用于管理代码和依赖的版本,按照Maven的集中管理的思想,有时难以胜任分布式JavaWeb的需要,此时需要使用Maven的聚合和继承特性。

Maven的聚合工程指项目的打包方式为pom,它有如下特点:

  • 1. 聚合工程本身是一个带pom文件的完整工程,它不包含src/main/java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
  • 2. 聚合工程的打包方式为“pom”。
  • 3. 引入了新的元素:modules---module。
  • 4. 版本:聚合模块的版本和被聚合模块版本一致。
  • 5. 通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM。
如下是Maven聚合工程中关于被聚合对象的定义:

    ../alitycommon
    ../alitymanager
模块定义了聚合块,在创建子module时自动添加,但是在子module删除时不会跟随自动删除。

Maven的继承可以类比于面向对象编程范畴的继承,主要目的是为了使子工程与父工程具备相同的模块版本和默认属性。在一般Java源码中可以得到佐证,本项目采用的parent标识类即为所有工程的父工程,确保所有的子工程使用相同的依赖版本。


    ality-parent
    priv.zenhobby
    1.0-SNAPSHOT
    ../alityparent/pom.xml
如上代码是子工程中的定义,定义了父工程,其中即是父工程POM文件的路径

四、技术选型和开发环境

技术选项:

  1. 数据库:mysql
  2. Dao层:mybatis、数据库连接池(alibaba-druid)
  3. 缓存:    redis
  4. 搜索:    solr
  5. Service层:spring
  6. 表现层:     springmvc、jstl、EasyUI、jsp、freemaker
  7. 图片服务器:FastDFS(分布式文件系统)
  8. 反向代理服务器:nginx
  9. 定时器:Quartz
  10. Web服务器:tomcat
  11. 工程管理:maven

开发环境:

  1. Intellj Idea 2017.3 Ultimate。
  2. Maven 3.5.0
  3. Tomcat 7.0.82
  4. JDK 1.8.0_152
  5. Mysql 5.7
  6. Nginx 1.8.0
  7. Redis 3.0.0
  8. Windows 10 x64
  9. Git

五、工程目录

1. 父工程

在此项目中父工程用于实现模块版本控制,项目名称为ality-parent,创建时选择Maven工程,可以不选择任何archetype。

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第1张图片

生成工程如下:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第2张图片

创建alityparent父工程之后在pom文件中定义模块版本,引入依赖:



    4.0.0

    priv.zenhobby
    ality-parent
    pom
    1.0-SNAPSHOT

    
    
        4.12
        4.1.3.RELEASE
        3.2.8
        1.2.2
        1.2.15
        5.1.6
        1.6.4
        2.4.2
        1.0.9
        4.3.5
        1.2
        2.5
        2.0
        2.5
        3.7
        1.3.2
        3.3
        3.2.1
        0.9.1
        1.3.1
        2.7.2
        4.10.3
        2.3.23
        2.2.2
    
    
        
            
            
                joda-time
                joda-time
                ${joda-time.version}
            
            
            
                org.apache.commcommons
                commons-lang3
                ${commons-lang3.version}
            
            
                org.apache.commons
                commons-io
                ${commons-io.version}
            
            
                commons-net
                commons-net
                ${commons-net.version}
            
            
            
                com.fasterxml.jackson.core
                jackson-databind
                ${jackson.version}
            
            
            
                org.apache.httpcomponents
                httpclient
                ${httpclient.version}
            
            
            
                junit
                junit
                ${junit.version}
                test
            
            
            
                org.slf4j
                slf4j-log4j12
                ${slf4j.version}
            
            
            
                org.mybatis
                mybatis
                ${mybatis.version}
            
            
                org.mybatis
                mybatis-spring
                ${mybatis.spring.version}
            
            
                com.github.miemiedev
                mybatis-paginator
                ${mybatis.paginator.version}
            
            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.2
            
            
                com.github.pagehelper
                pagehelper
                ${pagehelper.version}
            
            
            
                mysql
                mysql-connector-java
                ${mysql.version}
            
            
            
                com.alibaba
                druid
                ${druid.version}
            
            
            
                org.springframework
                spring-context
                ${spring.version}
            
            
                org.springframework
                spring-beans
                ${spring.version}
            
            
                org.springframework
                spring-webmvc
                ${spring.version}
            
            
                org.springframework
                spring-jdbc
                ${spring.version}
            
            
                org.springframework
                spring-aspects
                ${spring.version}
            
            
                org.springframework
                spring-context-support
                ${spring.version}
            
            
            
                jstl
                jstl
                ${jstl.version}
            
            
                javax.servlet
                servlet-api
                ${servlet-api.version}
                provided
            
            
                javax.servlet
                jsp-api
                ${jsp-api.version}
                provided
            
            
            
                commons-fileupload
                commons-fileupload
                ${commons-fileupload.version}
            
            
            
                redis.clients
                jedis
                ${jedis.version}
            
            
            
                org.apache.solr
                solr-solrj
                ${solrj.version}
            
            
                org.freemarker
                freemarker
                ${freemarker.version}
            
            
                org.quartz-scheduler
                quartz
                ${quartz.version}
            
        
    

    
        ${project.artifactId}
        
            
            
                org.apache.maven.plugins
                maven-resources-plugin
                2.7
                
                    UTF-8
                
            
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.2
                
                    1.8
                    1.8
                    UTF-8
                
            
        
        
            
                
                
                    org.apache.tomcat.maven
                    tomcat7-maven-plugin
                    2.2
                
            
        
    

2. 聚合工程

此工程先创建一个后台管理工程,用于管理购物网站的后台,工程名称为ality-manager,使用Idea的Module创建:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第3张图片

项目名称为ality-manager,创建时选择Maven工程,可以不选择任何archetype。创建完毕后ality-manager的pom文件中显示如下:



    
        ality-parent
        priv.zenhobby
        1.0-SNAPSHOT
        ../alityparent/pom.xml
    
    4.0.0

    ality-manager
    pom
此时已经指定父工程为ality-parent,并成功继承父工程中关于模块的定义。父工程ality-parent工程中自动添加了如下代码:

    
        ../alitymanager
    
即parent工程已经将alitymanager视作聚合的一部分。

3. 组件工程

组件工程主要两类,

3.1 工具组件

工具组件与ality-manager同级,继承自ality-parent的ality-common工程,用于容纳项目中常用的工具组件:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第4张图片

alitycommon的pom文件如下所示:



    
        ality-parent
        priv.zenhobby
        1.0-SNAPSHOT
        ../alityparent/pom.xml
    
    4.0.0
    ality-common
    
        3.7
    
    
    
        
        
            joda-time
            joda-time
        

        
            commons-net
            commons-net
        
        
        
            com.fasterxml.jackson.core
            jackson-databind
        
        
        
            org.apache.httpcomponents
            httpclient
        
        
        
            junit
            junit
        
        
        
            org.slf4j
            slf4j-log4j12
        
    

创建common工程之后将common作为ality-manager的依赖项加入ality-manager的POM文件中:


        
            priv.zenhobby
            ality-common
            1.0-SNAPSHOT
        
    

3.2 功能组件

功能组件是ality-manager中包含的组件工程,按照MVC的分类,可以将JavaWeb后台进行功能分层,分为如下层次:

|--ality-common(工具组件)

|--ality-manager(父工程)

    |-ality-manager-pojo(数据结构)

    |-ality-manager-dao(数据库访问)

    |-ality-manager-service(业务逻辑)

    |-ality-manager-web(页面交互)

其中pojo承载数据结构,dao包含数据库访问方法,service工程承载业务逻辑,web类包含页面和交互(web可以使用archetype)。

ality-manager-pojo创建使用普通maven工程:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第5张图片

pojo类的POM中加入mybatis-generator依赖项,以便于后面做逆向:



    
        ality-manager
        priv.zenhobby
        1.0-SNAPSHOT
    
    4.0.0

    ality-manager-pojo

    
        
            
            org.mybatis.generator
            mybatis-generator-maven-plugin
            1.3.2
            
                src/main/resources/generatorConfig.xml
                true
                true
            
            
                
                    Generate MyBatis Artifacts
                    
                        generate
                    
                
            
            
                
                    org.mybatis.generator
                    mybatis-generator-core
                    1.3.2
                
                
                    mysql
                    mysql-connector-java
                    5.1.6
                    runtime
                
            
        
    
    

ality-manager-dao工程创建普通Maven工程

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第6张图片

dao工程需要在pom文件中加入数据库访问相关依赖项:



    
        ality-manager
        priv.zenhobby
        1.0-SNAPSHOT
    
    4.0.0

    ality-manager-dao

    
        
            priv.zenhobby
            ality-manager-pojo
            1.0-SNAPSHOT
        

        
        
            org.mybatis
            mybatis
        
        
            org.mybatis
            mybatis-spring
        
        
            com.github.miemiedev
            mybatis-paginator
        
        
            com.github.pagehelper
            pagehelper
        
        
        
            mysql
            mysql-connector-java
        
        
        
            com.alibaba
            druid
        
    
ality-manager-service工程创建普通Maven工程
JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第7张图片

service工程需要在pom文件中加入spring相关的依赖项:



    
        ality-manager
        priv.zenhobby
        1.0-SNAPSHOT
    
    4.0.0

    ality-manager-service

    
        
            priv.zenhobby
            ality-manager-dao
            1.0-SNAPSHOT
        

        
            org.springframework
            spring-context
        
        
            org.springframework
            spring-beans
        
        
            org.springframework
            spring-webmvc
        
        
            org.springframework
            spring-jdbc
        
        
            org.springframework
            spring-aspects
        
        
            org.springframework
            spring-context-support
        
    
ality-manager-service 工程创建Maven工程
JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第8张图片

生成的工程中已经存在了WEB-INF目录:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第9张图片

web工程需要在pom文件中加入servlet和jstl等依赖项:


    
        ality-manager
        priv.zenhobby
        1.0-SNAPSHOT
    
    4.0.0
    ality-manager-web
    war
    ality-manager-web Maven Webapp
    http://maven.apache.org
    
        
            junit
            junit
            3.8.1
            test
        
        
            priv.zenhobby
            ality-manager-service
            1.0-SNAPSHOT
        
        
        
            jstl
            jstl
        
        
            javax.servlet
            servlet-api
            provided
        
        
            javax.servlet
            jsp-api
            provided
        
        
        
            commons-fileupload
            commons-fileupload
        
    
    
        ality-manager-web
    

4. 成品结构

本博客说到的Maven聚合工程体系成品结构如下:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第10张图片

5. 需要注意的问题

1. Idea的Maven命令:

Idea中的Maven命令被包含在名为"Maven Projects"的Tool window中:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第11张图片

该窗口下每个Maven项目均包含三个类型的Maven命令:

JavaWeb从新手到入门(一)Intellj Idea 2017下的Maven聚合工程体系_第12张图片

其中:

  • lifecycle:          包含了工程的主要maven命令,install和package均使用lifecycle中的命令
  • plugins:           包含由插件和POM中的命令行提供的maven命令
  • Dependecies: 包含了maven正确识别出来的依赖项,如果存在失误会显示红色波浪线。

2. 安装顺序

Maven的工程需要满足依赖次序,即被依赖的项目要首先被编译和安装,之后依赖该项目的项目才可以正确编译。

Maven compile: 编译源代码,一般编译src/main/java目录,生成.class文件

Maven clean:清理项目,一般是清理项目的target文件夹。

Maven test: 测试项目,一般执行src/test下的测试用例。

Maven package打包到本项目,一般是在项目target目录下。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目。

Maven install:打包会安装到本地的maven仓库中,如果没有设置过maven本地仓库,一般在用户/.m2目录下。如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件。

Maven deploy: 将打包的文件发布到远程参考,提供其他人员进行下载依赖。


你可能感兴趣的:(Java,JavaWeb)