maven的基本使用

00【补充】项目的打包方式

1.   目地

把项目放到tomcat里面去运行

2.   方式1【不推荐】

直接把WebRoot里面的内容放到tomcat的webapps里面

缺点

如果项目有依赖于非WEB-INF/bin里面的jar包。那么不会被引入

3.   方式2【推荐】

再把war包放到tomcat的webapps里面去运行

01【熟悉】maven概述

1,定义 

1,Maven 作为 Apache 的一个开源项目,旨在给项目管理提供更多的支持,它最早的意图只是为了给 apache 组织的几个项目提供统一的开发、测试、打包和部署,能让开发者在多个项目中方便的切换。

2,Maven 中最值得称赞的地方就是使用了标准的目录结构和部署。

3,在多个开发团队环境的情况下,Maven可以设置标准。由于大部分的项目设置简单可重复使用,使使Maven开发容易,创建报告,检查,生产和测试完全自动化设置。

4,maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。

5,maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

2,基本原理

Maven 的基本原理很简单,采用远程仓库和本地仓库以及一个类似 build.xml 的 pom.xml ,将 pom.xml 中定义的 jar 文件从远程仓库下载到本地仓库,各个应用使用同一个本地仓库的 jar ,同一个版本的 jar 只需下载一次,而且避免每个应用都去拷贝 jar 。

同时它采用了现在流行的插件体系架构,只保留最小的核心,其余功能都通过插件的形式提供,所以 maven 下载很小,在执行 maven 任务时,才会自动下载需要的插件。

 

mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。

 

此时,B Repository被称为A Repository的镜像。如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。

< mirrors/>是镜像列表,是maven从远程仓库里下载构件的一组服务器镜像。镜像能减轻中央maven库的负载,也能突破代理等的网络环境的限制,每个仓库都有一个ID,而mirror需要和仓库的ID对应。

 

3,坐标

(1)定义

坐标用来标识时空中的某个点,方便人们找到位置,如中电信息大厦可以用经纬度坐标找到,也可以通过国家、省市区、街道、门牌组成的坐标去找。

(2)分类

groupId: 组织ID,一般是公司、团体名称

artifactId:实际项目的ID,一般是项目、模块名称

version:版本,开发中的版本一般打上 SNAPSHOT 标记

 

4,特点

1,依赖管理是maven的一大特征,对于一个简单的项目,对依赖的管理并不是什么困难的事,但是如果这个项目依赖的库文件达到几十个甚至于上百个的时候就不是一个简单的问题了。在这个时候maven对于依赖管理的作用就显露出来了。

2,传递性依赖是在maven2中添加的新特征,这个特征的作用就是你不需要考虑你依赖的库文件所需要依赖的库文件,能够将依赖模块的依赖自动的引入。

3,由于没有限制依赖的数量,如果出现循环依赖的时候会出现问题,这个时候有两种方式处理,一种是通过 build-helper-maven-plugin 插件来规避,另一种就是重构两个相互依赖的项目。

4,通过传递性依赖,项目的依赖结构能够很快生成。Maven 能够解决依赖传递

5,传递依赖中需要关注的就是依赖调解,依赖调解的两大原则是:最短路径优先和第一声明优先

6,maven有三套classpath(编译classpath,运行classpath,测试classpath)分别对应构建的三个阶段。依赖范围就是控制依赖与这三套classpath的关系。

7,依赖范围有六种:

compile:编译依赖范围,在三个classpath都有效。

test:测试依赖范围,在编译代码和运行代码是无效。

provided:以提供的依赖范围,在编译和测试的时候有效,在运行的时候无效。例如servlet-api,因为容器已经提供,在运行的时候是不需要的。

runtime:运行时依赖范围,仅在测试和运行的时候有效。例如jdbc只有在测试和运行的时候才有效。

system:系统依赖范围,与provided范围一致,但是依赖是通过系统变量来指定依赖,不利于移植。

5,三级仓库结构

(1)远程公用仓库

Maven 内置了远程公用仓库: http://repo1.maven.org/maven2 这个公用仓库也叫中央仓库是由 Maven 自己维护,包好了世界上大部分流行的开源项目构件。 

https://mvnrepository.com 

(2)内部中央仓库

也称私有共享仓库(私服)。一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可以作为公用类库镜像缓存,减少在外部访问和下载的频率。

(3)本地仓库

Maven 会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,通常默认在 $user.home/.m2/repository 下。

 

 

 

02【掌握】eclipse集成maven插件

Jdk的配置

1,下载maven服务器

解压

2,配置环境变量

3,测试

4,maven的配置

配置文件的址

 ..maven/conf/settings.xml

配置本地库存

配置镜像地址

<mirror> 

          <id>alimaven</id> 

          <name>aliyun maven</name> 

          <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 

          <mirrorOf>central</mirrorOf>         

        </mirror> 

Maven项目的JDK配置

<profile> 

                <id>jdk1.8</id> 

                <activation> 

                       <activeByDefault>true</activeByDefault> 

                       <jdk>1.8</jdk> 

                </activation> 

                <properties> 

                       <maven.compiler.source>1.8</maven.compiler.source> 

                       <maven.compiler.target>1.8</maven.compiler.target> 

                       <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> 

                </properties> 

        </profile>

5,在eclipse下安装插件

打开sts

Window-Perferences/maven

Jdk的修改

-Dmaven.multiModuleProjectDirectory=MAVEN_HOME(注意前面的-不可省略)

03【掌握】eclipse下创建java项目

创建项目

项目目录 说明

依赖pom.xml

依赖排除pom.xml

依赖范围pom.xml

依赖范围—本地jar  pom.xml

04【掌握】eclipse下maven项目聚合依赖

1.   项目与项目的依赖

可以用来抽取不同的项目的公共部分

2.   项目继承1

创建03_maven_parent

打包方式是pom

修改03_maven_parent的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sxt</groupId>

    <artifactId>03_maven_parent</artifactId>

    <version>1.0</version>

    <packaging>pom</packaging>

 

    <!-- 全局常量配置 -->

    <properties>

         <spring.version>4.3.24.RELEASE</spring.version>

    </properties>

    <!-- 依赖配置 -->

    <dependencies>

         <!--spring-beans -->

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-beans</artifactId>

             <version>${spring.version}</version>

 

         </dependency>

         <!-- javax.servlet-api -->

         <dependency>

             <groupId>javax.servlet</groupId>

             <artifactId>javax.servlet-api</artifactId>

             <version>3.1.0</version>

             <scope>provided</scope>

         </dependency>

 

    </dependencies>

</project>

创建03_maven_children的pom.xml

打包方式是jar

总结

当父项目依赖了包之后,子项目只要继承当前这个父项目,就拥有的父项目依赖的所有包

3.   项目继承2

修改03_maven_parent

修改03_maven_children

总结

在父项目里面使用dependencyManagement来管理依赖,那么在子项目继承父项目的时候 子项目不能直接得到依赖,而要主动声明需要的依赖,不能指定版本号

如果父项目里面没有。那么必须指定版本号

4.   项目聚合

以JD为例按模块功能分

https://www.jd.com   路由系统

        |-- https://imall.jd.com/      192.168.11.110

        |-- https://chongzhi.jd.com     192.168.11.111

        |-- https://help.jd.com/index.html 192.168.11.112

        |-- https://channel.jd.com/home.html 192.168.11.113

        |-- https://jiadian.jd.com/   192.168.11.114

        |-- https://miaosha.jd.com  192.168.11.115

        |-- https://passport.jd.com/uc/login?   192.168.11.116

        |-- https://cart.jd.com/cart.action   192.168.11.117

        |--图片服务器

 

       

为什么这么分

解决高可用的问题

每个系统可以部署在不同的服务器上

以按三层结构

com.sxt.domain

com.sxt.mapper

com.sxt.service

com.sxt.controller

汽车出租

        common  项目

        carrent  ---父项目  打包形式pom   project   依赖common

                |--carrent-domain  实体项目     继承carrent  打包形式jar  module

                |--carrent-mapper 

|--访问数据库的项目  继承carrent

|--打包形式 jar

|--依赖 carrent-domain     

        |--carrent-service

                               |--提供服务的项目

                               |--打包形式jar

                               |--依赖carrent-mapper

        |--carrent-controller

                               |--web项目层   打包形式war

                               |--依赖carrent-service

                      

电商

        模块  前端项目     购物车系统   后台管理系统    单点登陆系统    缓存系统    

总项目  pom

   |--公共模块 common

   |--前端项目 pom

                |--domain

               |--mapper

                |--service

                |--web

   |--购物车系统  pom

                |--domain

               |--mapper

                |--service

                |--web

   |--后台管理系统  pom

                |--domain

               |--mapper

                |--service

                |--web

   |--单点登陆系统   pom

                |--domain

               |--mapper

                |--service

                |--web

   |--缓存系统       pom

                |--domain

               |--mapper

                |--service

                |--web

05【掌握】eclipse下创建maven的WEB项目

创建项目

  

解决其它源码包不显示的问题

重要的

Src/main/java

Src/main/resources

结构说明

Webapps----àWebRoot

修改pom.xml

引入servlet

引入jsp

引入jstl

<properties>

          <jsp.version>2.2</jsp.version>

          <servlet.version>3.1.0</servlet.version>

          <jstl.version>1.1.2</jstl.version>

     </properties>

 

     <dependencies>

          <!-- jsp-api -->

          <dependency>

                <groupId>javax.servlet.jsp</groupId>

                <artifactId>jsp-api</artifactId>

                <version>${jsp.version}</version>

                <scope>provided</scope>

          </dependency>

          <!-- javax.servlet-api -->

          <dependency>

                <groupId>javax.servlet</groupId>

                <artifactId>javax.servlet-api</artifactId>

                <version>${servlet.version}</version>

                <scope>provided</scope>

          </dependency>

          <!-- jstl -->

          <dependency>

                <groupId>javax.servlet</groupId>

                <artifactId>jstl</artifactId>

                <version>${jstl.version}</version>

          </dependency>

 

          <!-- taglibs/standard -->

          <dependency>

                <groupId>taglibs</groupId>

                <artifactId>standard</artifactId>

                <version>${jstl.version}</version>

          </dependency>

 

 

     </dependencies>

配置tomcat插件

 

    <build>

         <finalName>01_maven_web_hello</finalName>

         <plugins>

             <!-- 配置tomcat的运行插件 -->

             <plugin>

                 <groupId>org.apache.tomcat.maven</groupId>

                  <artifactId>tomcat7-maven-plugin</artifactId>

                  <version>2.2</version>

                  <configuration>

                      <!-- 配置端口 -->

                      <port>8080</port>

                      <!-- 配置urlencoding -->

                      <uriEncoding>UTF-8</uriEncoding>

                      <!-- 配置项目的访问路径 -->

                      <path>/bjsxt</path>

                  </configuration>

             </plugin>

 

         </plugins>

 

    </build>

配置jdk版本[选择性配置]

    <!-- 配置jdk的编译版本 -->

             <plugin>

                  <groupId>org.apache.maven.plugins</groupId>

                  <artifactId>maven-compiler-plugin</artifactId>

                  <version>3.7.0</version>

                  <configuration>

                      <!-- 指定source和target的版本 -->

                      <source>1.8</source>

                      <target>1.8</target>

                  </configuration>

             </plugin>

运行

修改servlet的版本

原来的项目servlet版本是2.3  想变成3.1

@WebServlet

@Filter

@Linstener

1,  删除web.xml

2,  右键项目  properties  àproject facets 

3,  先去掉Dynamic Web Module 前面的复选  再apply

4,  再选版本为3.1

5,  再勾复选

6,  点击如下图的链接

7,  创建web.xml

07【掌握】使用maven重构springmvc的项目

创建项目

导入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sxt</groupId>

    <artifactId>0520carrent</artifactId>

    <packaging>war</packaging>

    <version>1.0</version>

    <name>0520carrent Maven Webapp</name>

    <url>http://maven.apache.org</url>

    <!-- 声明版本 -->

    <properties>

         <jsp.version>2.2</jsp.version>

         <servlet.version>3.1.0</servlet.version>

         <jstl.version>1.2</jstl.version>

        <standard.version>1.1.2</standard.version>

         <spring.version>4.3.24.RELEASE</spring.version>

         <mybatis.version>3.5.2</mybatis.version>

         <mybatis.spring.version>1.3.3</mybatis.spring.version>

         <mysql.version>5.1.47</mysql.version>

         <druid.version>1.1.19</druid.version>

         <pagehelper.version>5.1.10</pagehelper.version>

         <quartz.version>2.2.0</quartz.version>

         <jackson.version>2.9.9</jackson.version>

         <fileupload.version>1.3.1</fileupload.version>

         <hutool.version>4.6.4</hutool.version>

         <zxing.version>3.4.0</zxing.version>

         <poi.version>4.1.0</poi.version>

         <log4j.version>1.2.17</log4j.version>

         <fastjson.version>1.2.56</fastjson.version>

         <validation.version>2.0.1.Final</validation.version>

         <hibernate.validator.version>6.0.17.Final</hibernate.validator.version>

    </properties>

 

    <dependencies>

         <!-- jsp-api -->

         <dependency>

             <groupId>javax.servlet.jsp</groupId>

             <artifactId>jsp-api</artifactId>

             <version>${jsp.version}</version>

             <scope>provided</scope>

         </dependency>

         <!-- javax.servlet-api -->

         <dependency>

             <groupId>javax.servlet</groupId>

             <artifactId>javax.servlet-api</artifactId>

             <version>${servlet.version}</version>

             <scope>provided</scope>

         </dependency>

         <!-- jstl -->

         <dependency>

             <groupId>javax.servlet</groupId>

             <artifactId>jstl</artifactId>

             <version>${jstl.version}</version>

         </dependency>

 

         <!-- taglibs/standard -->

         <dependency>

             <groupId>taglibs</groupId>

             <artifactId>standard</artifactId>

             <version>${standard.version}</version>

         </dependency>

         <!-- 导入spring -->

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-aspects</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-aop</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-context</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-core</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-expression</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-jdbc</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-tx</artifactId>

             <version>${spring.version}</version>

         </dependency>

 

         <!-- springmvc -->

         <dependency>

             <groupId>org.springframework</groupId>

             <artifactId>spring-webmvc</artifactId>

             <version>${spring.version}</version>

         </dependency>

         <!-- mybatis -->

         <dependency>

             <groupId>org.mybatis</groupId>

             <artifactId>mybatis</artifactId>

             <version>${mybatis.version}</version>

         </dependency>

         <!-- mybatis-spring -->

         <dependency>

             <groupId>org.mybatis</groupId>

             <artifactId>mybatis-spring</artifactId>

             <version>${mybatis.spring.version}</version>

         </dependency>

 

         <!-- pagepelper -->

         <dependency>

             <groupId>com.github.pagehelper</groupId>

             <artifactId>pagehelper</artifactId>

             <version>${pagehelper.version}</version>

         </dependency>

         <!-- mysql数据库驱动 -->

         <dependency>

             <groupId>mysql</groupId>

             <artifactId>mysql-connector-java</artifactId>

             <version>${mysql.version}</version>

         </dependency>

         <!-- json -->

         <dependency>

             <groupId>com.fasterxml.jackson.core</groupId>

             <artifactId>jackson-databind</artifactId>

             <version>${jackson.version}</version>

         </dependency>

 

         <!-- 文件上传 -->

         <dependency>

             <groupId>commons-fileupload</groupId>

             <artifactId>commons-fileupload</artifactId>

             <version>${fileupload.version}</version>

         </dependency>

 

         <!-- log4j -->

         <dependency>

             <groupId>log4j</groupId>

             <artifactId>log4j</artifactId>

             <version>${log4j.version}</version>

         </dependency>

 

         <!-- hutool-all -->

         <dependency>

             <groupId>cn.hutool</groupId>

             <artifactId>hutool-all</artifactId>

             <version>${hutool.version}</version>

         </dependency>

         <!-- /poi -->

         <dependency>

             <groupId>org.apache.poi</groupId>

             <artifactId>poi</artifactId>

             <version>${poi.version}</version>

         </dependency>

 

 

         <!--core -->

         <dependency>

             <groupId>com.google.zxing</groupId>

             <artifactId>core</artifactId>

             <version>${zxing.version}</version>

         </dependency>

         <dependency>

             <groupId>com.google.zxing</groupId>

             <artifactId>javase</artifactId>

             <version>${zxing.version}</version>

         </dependency>

         <!-- fastjson -->

         <dependency>

             <groupId>com.alibaba</groupId>

             <artifactId>fastjson</artifactId>

             <version>${fastjson.version}</version>

         </dependency>

         <!--validation-api -->

         <dependency>

             <groupId>javax.validation</groupId>

             <artifactId>validation-api</artifactId>

             <version>${validation.version}</version>

         </dependency>

 

         <!--hibernate-validator -->

         <dependency>

             <groupId>org.hibernate.validator</groupId>

             <artifactId>hibernate-validator</artifactId>

             <version>${hibernate.validator.version}</version>

         </dependency>

 

         <!-- druid -->

         <dependency>

             <groupId>com.alibaba</groupId>

             <artifactId>druid</artifactId>

             <version>${druid.version}</version>

         </dependency>

 

         <!--el-api -->

         <dependency>

             <groupId>org.apache.tomcat</groupId>

             <artifactId>el-api</artifactId>

             <version>6.0.29</version>

         </dependency>

    </dependencies>

    <build>

         <finalName>0520carrent</finalName>

 

         <plugins>

             <!-- 配置tomcat的运行插件 -->

             <plugin>

                  <groupId>org.apache.tomcat.maven</groupId>

                  <artifactId>tomcat7-maven-plugin</artifactId>

                  <version>2.2</version>

                  <configuration>

                      <!-- 配置端口 -->

                      <port>8080</port>

                      <!-- 配置urlencoding -->

                      <uriEncoding>UTF-8</uriEncoding>

                      <!-- 配置项目的访问路径 -->

                      <path>/bjsxt</path>

                  </configuration>

             </plugin>

 

             <!-- 配置jdk的编译版本 -->

             <plugin>

                  <groupId>org.apache.maven.plugins</groupId>

                  <artifactId>maven-compiler-plugin</artifactId>

                  <version>3.7.0</version>

                  <configuration>

                      <!-- 指定source和target的版本 -->

                      <source>1.8</source>

                      <target>1.8</target>

                  </configuration>

             </plugin>

         </plugins>

    </build>

</project>

配置tomcat运行插件

Copy代码和静态资源

配置web.xml

先使用外部的tomcat运行

08【掌握】maven项目的自动部署

相关命令的说明

Maven clean  清空之前生成的jar或者war  清空target目录下的内容

Maven install  打包生成的jar或war包

1,配置tomcat的账户conf/tomcat-users.xml

<role rolename="admin-gui"/>

<role rolename="admin-script"/>

<role rolename="manager-gui"/>

<role rolename="manager-script"/>

<user username="admin" password="admin" roles="admin-gui,admin-script,manager-gui,manager-script" />

重启tomcat登陆管理页面

2,配置maven的settings.xml

<server>

      <id>tomcat7</id>

      <username>admin</username>

      <password>admin</password>

    </server>

3,修改pom.xml的配置

 

4,使用eclipse启动部署

 

5,使用maven命令

 

 

 

6,注意点

以上的操作:tomcat状态必须是启动状堂雷哥文档  

https://files.cnblogs.com/files/chaojibaidu/%E5%B0%9A%E5%AD%A6%E5%A0%82maven%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3%E7%BB%93%E6%9E%84%E6%B8%85%E6%99%B0.zip

mavn学习补充参见:http://c.biancheng.net/view/4890.html

https://www.cnblogs.com/fanggege/p/12346265.html    有形象的图形来解释镜像与远程仓库的区别

https://www.cnblogs.com/java-linux/p/10263568.html   作为上面的补充

 

原文地址:https://www.cnblogs.com/chaojibaidu/p/13128898.html