参考:传智播客《电商项目-淘淘商城》
本系列博客是对JavaWeb后台实战项目的一个总结和记录,项目来自于传智播客的《淘淘商城》项目,网上已经有不少博客介绍项目的情况,港真,这是一个比较容易获得的、贴近生产场景的例子,所以学习一下还是很有价值的,在学习过程中还可以作为自己的练手项目,在闲暇时光进行重构和升级(就是不知道多少程序员能够有不加班重构一份学习代码的时间~),如是。
项目Github地址:Zenhobby/alitymanager
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的集中管理的思想,有时难以胜任分布式JavaWeb的需要,此时需要使用Maven的聚合和继承特性。
Maven的聚合工程指项目的打包方式为pom,它有如下特点:
../alitycommon
../alitymanager
Maven的继承可以类比于面向对象编程范畴的继承,主要目的是为了使子工程与父工程具备相同的模块版本和默认属性。在一般Java源码中可以得到佐证,本项目采用的parent标识类即为所有工程的父工程,确保所有的子工程使用相同的依赖版本。
ality-parent
priv.zenhobby
1.0-SNAPSHOT
../alityparent/pom.xml
如上代码是子工程中的定义,技术选项:
开发环境:
在此项目中父工程用于实现模块版本控制,项目名称为ality-parent,创建时选择Maven工程,可以不选择任何archetype。
生成工程如下:
创建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
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
此工程先创建一个后台管理工程,用于管理购物网站的后台,工程名称为ality-manager,使用Idea的Module创建:
项目名称为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视作聚合的一部分。
组件工程主要两类,
工具组件与ality-manager同级,继承自ality-parent的ality-common工程,用于容纳项目中常用的工具组件:
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
|--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工程: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
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工程
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工程
生成的工程中已经存在了WEB-INF目录:
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
本博客说到的Maven聚合工程体系成品结构如下:
5. 需要注意的问题
1. Idea的Maven命令:
Idea中的Maven命令被包含在名为"Maven Projects"的Tool window中:
该窗口下每个Maven项目均包含三个类型的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: 将打包的文件发布到远程参考,提供其他人员进行下载依赖。