maven
一、maven基础
1. maven的核心
- 依赖管理:对jar包管理的过程
- 项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署
2. maven安装、配置本地仓库
2.1. maven下载安装
- Maven 下载地址:http://maven.apache.org/download.cgi
- 解压到本地磁盘(目录不能有空格)
- 设置 Maven 环境变量
- 必须先安装jdk,配置JAVA_HOME
- 新建系统变量 MAVEN_HOME,变量值:
E:\Maven\apache-maven-3.3.9
- 编辑系统变量 Path,添加变量值:
;%MAVEN_HOME%\bin
- 查看maven版本信息,验证是否已成功安装
- 执行
mvn -v
- 执行
2.2. 配置本地仓库
2.2.1. 仓库类型:
本地仓库(local)、远程仓库(remote(私服))、中央仓库(central(Maven 社区维护))
2.2.2. 配置本地仓库
- 解压jar包压缩包到本地磁盘
- 配置本地仓库路径,修改默认位置,在
%MAVEN_HOME%\conf
目录中的 Maven 的settings.xml
文件中配置
路径。
3. maven项目标准目录结构
4. maven的常用命令:
dos窗口进入项目pox.xml所在目录,执行命令:mvn tomcat:run
4.1. maven 常用命令
-
-
clean
:清除项目根目录下target文件夹内所有内容 -
compile
:编译,将项目中的java文件编译为class文件 -
test
:单元测试,将项目根目录下src/java目录下的单元测试类都会执行
单元测试类名要求:***Test.java -
package
:打包
web project ==>war包
java project ==>jar包
将项目打包,打包项目根目录下target 目录 -
install
:安装
本地多个项目公用一个jar包,打包到本地仓库
-
4.2. maven项目的生命周期
-
- CleanLifeCycle:清理生命周期:clean
- defaultLifeCycle:默认生命周期:compile、test、package、install、deploy
- siteLifeCycle:站点生命周期:site
-
三套生命周期相互独立,互不影响。
在一套生命周期内,执行后面的命令,前面操作会自动执行。
4.3 概念模型
5. maven整合web项目
5.1. 配置maven插件
5.1.1 新版的eclipse自带maven插件
5.1.2 配置maven程序
5.1.3 配置userSetting
5.1.4 构建索引
注意配置本地仓库地址
5.2. maven整合Servlet
5.2.1 创建maven项目
5.2.2 创建好web项目产生的错误
-
-
web.xml缺失
-
-
- jdk编译版本为1.5,在pom.xml中添加插件
org.apache.maven.plugins
maven-compiler-plugin
1.8
UTF-8
-
-
创建一个Servlet,servlet编译报错,原因:缺失servlet-api-**.jar包
-
-
-
查找依赖
-
5.3. 依赖的范围
添加依赖范围:默认是compile
provided:运行部署到tomcat不再需要。
-
问题:如果将servlet-api.jar设置为compile,打包之后包含servlet-api.jar,war包部署到tomcat后跟tomcat中存在的servlet-api.jar包冲突。导致运行失败。
解决:修改依赖范围
- 依赖作用范围
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-corer |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的,Maven仓库之外的类库 |
- 总结:如果使用到tomcat自带jar包,将项目中依赖作用范围设置为:provided
5.4 运行、调试项目
5.5 maven整合struts2
5.5.1 通过工具生成web.xml及添加编译jdk版本
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
UTF-8
5.5.2 添加struts2的依赖
添加核心包,自动添加其他依赖包
5.5.3 创建struts.xml
5.5.4 创建action类继承ActionSupport类
5.5.5 在web.xml中配置Struts2框架核心过滤器
struts
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts
/*
5.5.6 编写action中的方法
//url http://localhost:8080/maven-struts2/customerAction_test.action
public String test() throws Exception {
System.out.println("成功进入CustomerAction中的test方法");
return SUCCESS;
}
5.5.7 在struts.xml中配置action
/index.jsp
二、Maven实战
1.传递依赖冲突解决
1.1Maven自己调解原则
1.1.1 第一声明优先原则
谁先定义就用谁优先传递依赖
1.1.2 路径近者优先原则
直接依赖级别高于传递依赖。
1.2 排除依赖
1.3 版本锁定(推荐使用)
1.4 配置文件中的属性引用
在配置文件中定义属性,使用ognl表达式引用属性值
2. ssh配置文件加载过程
3.通过maven整合ssh框架
3.1 ssh框架所需要的jar包
3.1.1 主要jar包及关系
- struts2-spring-plugin
- spring-orm
- aspectjweaver
- hibernate-core
- hibernate-c3p0
依赖 | 简述 |
---|---|
struts2-spring-plugin(2.5.12) | Spring 集成Struts2 所需包,此系列包会帮你下载struts2 和spring(4.1.6) 相关基础jar包,加一个struts2-spring-plugin(2.5.12).jar 包。(所以,加入这个依赖之后,maven会帮你下载struts2 和spring 基础包,自己不用再添加加Struts2 和spring 的依赖了。而我又添加了spring-context-4.3.10.RELEASE 的原因下面细说。) |
spring-context(4.3.10) | 会帮你下载spring基础jar包: (加此依赖的原因:可能是因为hibernate5 ,版本过高与spring.4.1.6 不兼容吧,出现java.lang.NoClassDefFoundError: org/springframework/core/ResolvableTypeProvider 异常,spring 在4.2版本新加了一个公共接口ResolvableTypeProvider ,在使用spring-orm 中的hibernate5 相关类需要用到此接口。所以spring 用4.2之后的新版本。添加不同版本的dependency ,后面添加的会无效) |
spring-orm | Spring 集成Hibernate 所需包,内中包含spring 使用hibernate 所需相关类。 |
aspectjweaver.jar | SpringAop 所依赖的包,spring AoP 就是用aspectj 来实现的,是依赖关系!AspectJ 是动态代理的一种实现!spring 默认使用的就是AspectJ 来实现的动态代理。 |
spring-aspects | spring-aspects 直接依赖于aspectjweaver.jar ,所以引入该包统一版本 |
hibernate-core | Hibernate 核心包。hibernate5 与hibernate4 相比,区别不少(使用需谨慎!) |
hibernate-c3p0 | 配置Mysql-c3p0 数据源和连接池所需包 |
3.1.2 pom.xml最终配置
UTF-8
2.5.10
4.3.10.RELEASE
5.1.7.Final
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
UTF-8
org.springframework
spring-beans
${spring.version}
org.springframework
spring-core
${spring.version}
org.apache.struts
struts2-spring-plugin
${struts.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-test
${spring.version}
org.hibernate
hibernate-core
${hebernate.version}
org.hibernate
hibernate-c3p0
${hebernate.version}
com.oracle
ojdbc6
11.2.0
junit
junit
4.12
3.2 搭建struts2环境
3.2.1 创建struts2配置文件:struts.xml
3.2.2 在web.xml中配置struts2的核心过滤器
struts
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
struts
/*
3.3 搭建spring环境
3.3.1 创建spring配置文件:applicationContext.xml
3.3.2 在web.xml中配置监听器:ContextLoaderListener
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
3.4 搭建Hibernate环境
3.4.1 创建Hibernate核心配置文件
org.hibernate.dialect.Oracle10gDialect
true
true
none
ehrp
jdbc:oracle:thin:@192.168.0.134:1521/ehrp
user_developer
user_developer
oracle.jdbc.OracleDriver
3.5 struts2跟spring整合
整合要点:action对象创建,交给spring创建
3.5.1 创建action类
3.5.2 将action对象配置到spring文件中
3.5.3 在struts.xml中的action节点中class属性配置为spring工厂中action对象bean的id
/index.jsp
3.6 spring跟hibernate整合
整合要点:
3.6.1 数据源DataSource交给spring
3.6.2 SessionFactory对象交给spring创建
去掉hibernate.cfg.xml中数据库配置信息
3.6.3 事务管理
-
- 配置事务框架:PlatformTransactionManager接口
1.1. jdbc:DataSourceTransactionManager
1.2. Hibernate:HibernateTransactionManager
- 1.3. 注解方式管理事务
3.7 需求
在地址栏输入action请求http://localhost:8080/maven-ssh/phoneUserAction_findOne.action?phoneUserId=1
,action-service-dao。完成客户需求。
3.8 具体实现
3.8.1. 创建客户实体类、映射文件、将映射文件引入hibernate核心配置文件中
3.8.2. 创建action、service、dao。完成注入。
-
- 在类中添加属性生成set 方法
//serviceImpl
private PhoneUserDao phoneUserDao;
public void setPhoneUserDao(PhoneUserDao phoneUserDao) {
this.phoneUserDao = phoneUserDao;
}
//action
private PhoneUserService phoneUserService;
public void setPhoneUserService(PhoneUserService phoneUserService) {
this.phoneUserService = phoneUserService;
}
-
- 在spring配置文件中完成注入
-
- 在struts.xml配置action,配置结果视图
/index.jsp
-
- 新版本jar包可能产生的问题:
-
4.1. struts从2.3.X升级到2.5.18中遇到的问题及解决办法
- 方法不能访问的问题,需要在每个action配置文件中加上
strict-method-invocation="false"
:
或者全局配置
并修改配置文件头部为2.5版本的:
4.2. web.xml中把
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
改为org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
4.3. jdk版本需要1.7+
-
4.4. 如果提交表单出现404,需要将表单提交的路径改成使用basepath作位前缀:
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- 方法不能访问的问题,需要在每个action配置文件中加上
-
- maven build默认运行的tomcat版本为6.0,会产生如下错误:
Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: Unable to compile class for JSP:
解决:maven指定tomcat版本 maven build 命令改为tomcat7:run
```xml
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
```
-
- 总结
-
- 页面提交参数,在服务端action接收参数 参
- 调用业务层方法-->dao的方法-->DB 调
- 将返回的数据存值栈 存
- 配置结果视图 ,跳转页面 转
4.通过maven对项目进行拆分、聚合
对现在已有maven ssh项目进行拆分,拆分思路:将dao层的代码、已经配置好的文件全体提取出来到一个表现上独立的工程中。同样service、action拆分。
-
- ssh-parent:(父工程)
- ssh-dao:(子模块)
- ssh-service
- ssh-web
- 拆分完成后,对拆分后的项目进行聚合,提出概念父工程。
4.1 创建父工程
创建好父工程目录结构:只有pom.xml,父工程不进行编码:
-
- 项目需要的依赖的信息,在父工程中定义,子模块继承过程。
- 将各个子模块聚合到一起。
UTF-8
2.5.10
4.3.10.RELEASE
5.1.7.Final
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
org.apache.maven.plugins
maven-surefire-plugin
2.19.1
true
org.springframework
spring-beans
${spring.version}
org.springframework
spring-core
${spring.version}
org.apache.struts
struts2-spring-plugin
${struts.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-test
${spring.version}
org.hibernate
hibernate-core
${hebernate.version}
org.hibernate
hibernate-c3p0
${hebernate.version}
com.oracle
ojdbc6
11.2.0
junit
junit
4.12
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
org.apache.logging.log4j
log4j-core
2.7
4.2 将创建好的父工程发布到本地仓库
maven install
忘记此步骤,将来service、dao工程发布到本地仓库,发布的service、dao工程会报错。
补救措施:将父工程发布到本地仓库。
4.3 创建子模块ssh-dao
ssh-dao负责数据访问层:包含dao相关代码&配置文件
将spring的配置文件进行拆分
- applicationContext-basic.xml:项目基础信息
- applicationContext-dao.xml:dao层bean对象
4.4 创建子模块ssh-service
在service工程pom.xml添加ssh-dao依赖
4.5 创建子模块ssh-web
修改spring配置:
contextConfigLocation
classpath*:spring/applicationContext-*.xml
在ssh-web项目中添加service工程依赖。
4.6 运行方式
maven方式:
方式1:运行父工程。父工程将各个子模块聚合到一起。将ssh-web打war包发布到tomcat
方式2:直接运行web工程。
其他方式:
部署到tomcat
f访问地址:http://localhost:8080/maven-ssh-web/phoneUserAction_findOne.action?phoneUserId=1
4.6 单元测试
4.6.1. 批量加载spring配置文件
-
-
classpath:applicationContext-*.xml
加载本项目配置文件
-
-
-
classpath*:spring/applicationContext-*.xml
既要加载本项目中配置文件,还要加载jar包中配置文件
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-*.xml") public class PhoneUserDaoTest { @Autowired private PhoneUserDao phoneUserDao; @Test public void testFindOne() { this.phoneUserDao.findOne("1"); } }
public class PhoneUserServiceTest { @Test public void testFindOne() { ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("classpath*:spring/applicationContext-*xml"); PhoneUserService phoneUserService = (PhoneUserService) context.getBean("phoneUserService"); phoneUserService.findOne("1"); } }
-
4.6.2. 依赖范围
A:ssh-service工程
B:ssh-dao工程
C:单元测试
总结:当项目中需要的某一个依赖没有传递过来,在自己工程中添加对应依赖。
5.私服
5.1 私服安装
-
下载安装包nexus-2.12.0-01-bundle.zip
加压到本地磁盘
使用管理员权限打开dos,执行安装命令
nexus install
安装私服(bin目录下)启动服务
nexus start
-
找到私服访问url:
http:localhost:8081/nexus/#welcome
登录:admin/admin123
5.2 私服仓库类型
- hosted:宿主仓库
存放本公司开发的jar包。正式发行版(releases)、测试版(snapshots)、第三方(存在版权问题的-oracle)
- Proxy:代理仓库
代理中央仓库、Apache下载测试版本jar包
- Group:组仓库
讲了连接组仓库。包含hosted:宿主仓库,Proxy:代理仓库
5.3 上传jar包到私服上
5.3.1. 在maven目录下conf/setting.xml认证:配置用户名密码
5.3.2. 在将要上传的项目的pom.xml配置jar包上传路径
5.3.3. 执行命令发布项目到私服(上传)
maven build
deploy
5.4 从私服下载jar包到本地仓库
5.4.1. 在maven目录下conf/setting.xml,配置模板
5.4.2. 激活模板
6. 总结
-
- 使用maven整合ssh框架
- 拆分maven工程
- a) 将每一层代码&配置文件全部提取到一个独立的工程
- b)
- 私服
7. Maven的好处
-
- 不再拷贝jar包。项目不需要存放jar包。导致项目源代码小。
- 使用maven开发的工程,如果环境统一导入别的maven的项目不会报错。
- 代码耦合度进一步降低
- 方便项目进行升级
- 节省人力成本