maven学习笔记(总)

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
      • maven学习笔记(总)_第1张图片
        查询maven版本信息
2.2. 配置本地仓库
2.2.1. 仓库类型:

​ 本地仓库(local)、远程仓库(remote(私服))、中央仓库(central(Maven 社区维护))

2.2.2. 配置本地仓库
  • 解压jar包压缩包到本地磁盘
  • 配置本地仓库路径,修改默认位置,在 %MAVEN_HOME%\conf 目录中的 Maven 的 settings.xml文件中配置路径。
    maven学习笔记(总)_第2张图片
    配置本地仓库路径

3. maven项目标准目录结构

maven学习笔记(总)_第3张图片
maven项目目录结构1
maven学习笔记(总)_第4张图片
maven项目目录结构2

4. maven的常用命令:

dos窗口进入项目pox.xml所在目录,执行命令:mvn tomcat:run

4.1. maven 常用命令
    1. clean:清除项目根目录下target文件夹内所有内容
    2. compile:编译,将项目中的java文件编译为class文件
    3. test:单元测试,将项目根目录下src/java目录下的单元测试类都会执行
      单元测试类名要求:***Test.java
    4. package:打包
      web project ==>war包
      java project ==>jar包
      将项目打包,打包项目根目录下target 目录
    5. install:安装
      本地多个项目公用一个jar包,打包到本地仓库
4.2. maven项目的生命周期
    1. CleanLifeCycle:清理生命周期:clean
    2. defaultLifeCycle:默认生命周期:compile、test、package、install、deploy
    3. siteLifeCycle:站点生命周期:site
  • 三套生命周期相互独立,互不影响。
    在一套生命周期内,执行后面的命令,前面操作会自动执行。


    maven的生命周期,项目构建过程
4.3 概念模型
maven学习笔记(总)_第5张图片
maven概念模型

5. maven整合web项目

5.1. 配置maven插件
5.1.1 新版的eclipse自带maven插件
5.1.2 配置maven程序
maven学习笔记(总)_第6张图片
eclipse配置maven插件
5.1.3 配置userSetting
maven学习笔记(总)_第7张图片
配置userSetting
5.1.4 构建索引

注意配置本地仓库地址


maven学习笔记(总)_第8张图片
构建maven索引
5.2. maven整合Servlet
5.2.1 创建maven项目
maven学习笔记(总)_第9张图片
1.选择创建maven项目
maven学习笔记(总)_第10张图片
2.选择项目原型
maven学习笔记(总)_第11张图片
3.maven项目信息
5.2.2 创建好web项目产生的错误
    1. web.xml缺失


      maven学习笔记(总)_第12张图片
      补加缺失web.xml
    1. jdk编译版本为1.5,在pom.xml中添加插件
 
  
    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            
                1.8
                1.8
                UTF-8
            
        
    
  
    1. 创建一个Servlet,servlet编译报错,原因:缺失servlet-api-**.jar包


      maven学习笔记(总)_第13张图片
      缺失jar包
    1. 查找依赖


      maven学习笔记(总)_第14张图片
      查找jar包
5.3. 依赖的范围

添加依赖范围:默认是compile
provided:运行部署到tomcat不再需要。

  • 问题:如果将servlet-api.jar设置为compile,打包之后包含servlet-api.jar,war包部署到tomcat后跟tomcat中存在的servlet-api.jar包冲突。导致运行失败。

    maven学习笔记(总)_第15张图片
    与tomcat中jar包冲突

  • 解决:修改依赖范围

maven学习笔记(总)_第16张图片
修改依赖范围
  • 依赖作用范围
依赖范围 对于编译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
maven学习笔记(总)_第17张图片
provided范围的jar包
5.4 运行、调试项目
maven学习笔记(总)_第18张图片
maven手动命令
maven学习笔记(总)_第19张图片
添加调试
5.5 maven整合struts2
5.5.1 通过工具生成web.xml及添加编译jdk版本
maven学习笔记(总)_第20张图片
通过工具生成web.xml
maven学习笔记(总)_第21张图片
自己添加插件
maven学习笔记(总)_第22张图片
搜索插件

    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.7.0
            
            
                1.8
                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 第一声明优先原则

谁先定义就用谁优先传递依赖

maven学习笔记(总)_第23张图片
第一声明优先原则.图一

maven学习笔记(总)_第24张图片
第一声明优先原则.图二
1.1.2 路径近者优先原则

直接依赖级别高于传递依赖。

maven学习笔记(总)_第25张图片
路径近者优先.图一
maven学习笔记(总)_第26张图片
路径近者优先.图二
1.2 排除依赖
maven学习笔记(总)_第27张图片
排除依赖操作

maven学习笔记(总)_第28张图片
排除依赖
1.3 版本锁定(推荐使用)
maven学习笔记(总)_第29张图片
版本锁定
1.4 配置文件中的属性引用

在配置文件中定义属性,使用ognl表达式引用属性值

maven学习笔记(总)_第30张图片
定义属性
maven学习笔记(总)_第31张图片
引用属性值

2. ssh配置文件加载过程

maven学习笔记(总)_第32张图片
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所需包,此系列包会帮你下载struts2spring(4.1.6)相关基础jar包,加一个struts2-spring-plugin(2.5.12).jar包。(所以,加入这个依赖之后,maven会帮你下载struts2spring基础包,自己不用再添加加Struts2spring的依赖了。而我又添加了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核心包。hibernate5hibernate4相比,区别不少(使用需谨慎!)
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
                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 事务管理
    1. 配置事务框架: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。完成注入。
    1. 在类中添加属性生成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;
  }
    1. 在spring配置文件中完成注入
    
        
            
        
        
        
            
        
         
        
            
        
    
    1. 在struts.xml配置action,配置结果视图

    
        
        
            /index.jsp
        
    

    1. 新版本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+"/";
        
    1. 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
        
```
    1. 总结
      1. 页面提交参数,在服务端action接收参数
      2. 调用业务层方法-->dao的方法-->DB
      3. 将返回的数据存值栈
      4. 配置结果视图 ,跳转页面

4.通过maven对项目进行拆分、聚合

对现在已有maven ssh项目进行拆分,拆分思路:将dao层的代码、已经配置好的文件全体提取出来到一个表现上独立的工程中。同样service、action拆分。

    1. ssh-parent:(父工程)
    2. ssh-dao:(子模块)
    3. ssh-service
    4. ssh-web
    5. 拆分完成后,对拆分后的项目进行聚合,提出概念父工程。
4.1 创建父工程
maven学习笔记(总)_第33张图片
创建父工程1
maven学习笔记(总)_第34张图片
创建父工程2

创建好父工程目录结构:只有pom.xml,父工程不进行编码:

    1. 项目需要的依赖的信息,在父工程中定义,子模块继承过程。
    2. 将各个子模块聚合到一起。
父工程目录结构

  
  
    
    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
                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相关代码&配置文件

maven学习笔记(总)_第35张图片
创建子模块ssh-dao-1
maven学习笔记(总)_第36张图片
创建子模块ssh-dao-2
maven学习笔记(总)_第37张图片
子模块拆分ssh-dao目录结构

将spring的配置文件进行拆分

  • applicationContext-basic.xml:项目基础信息
  • applicationContext-dao.xml:dao层bean对象
4.4 创建子模块ssh-service
maven学习笔记(总)_第38张图片
创建子模块maven-ssh-service-1

在service工程pom.xml添加ssh-dao依赖

4.5 创建子模块ssh-web
maven学习笔记(总)_第39张图片
创建子模块maven-ssh-web-1
maven学习笔记(总)_第40张图片
子模块maven-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配置文件
    1. classpath:applicationContext-*.xml加载本项目配置文件
    1. 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. 依赖范围
maven学习笔记(总)_第41张图片
依赖范围

A:ssh-service工程

B:ssh-dao工程

C:单元测试

总结:当项目中需要的某一个依赖没有传递过来,在自己工程中添加对应依赖。

5.私服

5.1 私服安装
    1. 下载安装包nexus-2.12.0-01-bundle.zip

    2. 加压到本地磁盘

    3. 使用管理员权限打开dos,执行安装命令nexus install安装私服(bin目录下)

    4. 启动服务nexus start

    5. 找到私服访问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认证:配置用户名密码
maven学习笔记(总)_第42张图片
上传私服-配置认证
5.3.2. 在将要上传的项目的pom.xml配置jar包上传路径
maven学习笔记(总)_第43张图片
上传私服-配置项目pom.xml
5.3.3. 执行命令发布项目到私服(上传)

maven build deploy

5.4 从私服下载jar包到本地仓库
5.4.1. 在maven目录下conf/setting.xml,配置模板
maven学习笔记(总)_第44张图片
配置模板
5.4.2. 激活模板

6. 总结

    1. 使用maven整合ssh框架
    2. 拆分maven工程
      • a) 将每一层代码&配置文件全部提取到一个独立的工程
      • b)
    3. 私服

7. Maven的好处

    1. 不再拷贝jar包。项目不需要存放jar包。导致项目源代码小。
    2. 使用maven开发的工程,如果环境统一导入别的maven的项目不会报错。
    3. 代码耦合度进一步降低
    4. 方便项目进行升级
    5. 节省人力成本

你可能感兴趣的:(maven学习笔记(总))