maven

一、maven的基本概念

maven是跨平台的项目管理工具,主要服务于基于java的项目构建,依赖管理和项目信息管理

二、下载和安装

1、下载

地址:http://maven.apache.org/download.cgi

2、安装

下载上面压缩包

解压上面的压缩包,可得

bin:含有mvn 的运行脚本

boot:含有plexus-classworlds-2.5.2.jar类加载器框架

config:含有settings.xml配置文件

lib:含有maven运行时所需的java类库

2、首先要确定电脑上已经安装了jdk并配置好了环境变量

3、设置系统环境变量

注意:解压缩后文件夹名一定要是apache-maven-3.5.4

4、设置环境变量,将MAVEN_HOME添加到path中

5、检测

在控制台上输入 mvn -v命令,若显示了maven的版本,则安装成功

三、快速入门

maven项目的目录约定

项目名

|——src

              |——main

                                |——java:存放项目的java文件,从包开始

                                |——resource:存放项目资源文件,即项目所需jar包

              |——test

                                 |——java:存放所有测试.java文件,如Junit测试类

                                 |——resource:存放项目资源文件,即项目所需jar包

           |——target:项目输出位置

2、pom.xml文件

和src放在同一目录下,用于标识该项目是一个maven项目

示例:

<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 所有maven项目都必须配置这四个配置项-->
  <modelVersion>4.0.0</modelVersion>
  <!--包名-->
  <groupId>com.imooc.maven01</groupId>
   <!--项目中的某一个模块,默认命名方式为 项目名-模块名-->
  <artifactId>maven01-model</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--dependencies指项目依赖的jar包,当项目编译时,需要某些jar包,则会从该标签下寻找,若里面有,则会先从本地仓库中加载该jar包,否则会从在线仓库中寻找-->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

具体项目见E:\maven\maven01

四、maven中常用的命令

mvn -v:查看mvn版本

mvn compile:编译项目,,当执行这个命令时,会生成target包

mvn test:执行测试类

mvn pakcage:将项目打包成jar包,并放在target文件夹下

mvn install:将jar包加入本地仓库中

mvn clean:将target文件夹删除              

五、自动创建项目目录骨架

用命令mvn archetype:generate接着按照提示输入相应的值

或者命令mvn archetype:generate -D后面直接列出所有值,比如-D groupId -DartifactId ......

六、maven的一些相关概念

坐标:构件的唯一标识符,pom.xml文件中的groupId、artifactId、version(快照的版本)就是构件的坐标,其中groupId最好写成项目名(包名如com.imooc.maven01,其中maven01为项目名),artifactId最好写成项目-模块名

仓库:就是存放了maven的核心插件和可供下载的jar包,分为本地仓库和远程仓库,当我们所需要的jar包在本地仓库中没有时,会从远程仓库中下载到本地仓库

默认的远程仓库可在

maven-model-builder-3.5.4-jar包(可将其先解压)的apache\maven\model\pom-4.0.0.xml文件中

<repository>
      <id>central</id>
      <name>Central Repository</name>

//地址
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>

就是远程仓库的配置,由于maven的远程仓库都在国外,所以访问的时候可能很慢,因此可以为该远程仓库设置镜像仓库

镜像仓库:就是国外的远程仓库的一个映射,方便用户访问

设置镜像仓库

maven\apache-maven-3.5.4\conf\settings.xml中配置

如:

<mirror>
      <id>maven.net.cn</id>
      <!-- 为远程仓库的id -->
      <mirrorOf>central</mirrorOf>
      <name>central mirror in china</name>
      <url>http://maven.net.cn/content/groups/public</url>
    </mirror>

本地仓库:从远程仓库上下载的jar包默认会放在,可以手动修改本地仓库的位置

通过修改settings.xml中配置

<localRepository>E:\maven\repo</localRepository>可将本地仓库指定为E:\maven\repo

七、在eclipse中安装maven插件

1、在window——>preferences中查看是否有maven,若有则已经安装maven插件

2、由于maven需要用到jdk,而eclipse默认是在jre上运行,所以需要配置一下

点击Add按钮——>添加jdk安装目录即可,然后勾选

3、在maven中配置

——>即自定义仓库中的settings.xml文件及仓库位置

8、maven插件及其生命周期

一个完整的项目构建过程包括清理、 编译、测试、打包、 集成测试、验证、部署等步骤,maven从中抽取出一套完善的易于扩展的生命周期,maven的生命周期是抽象的, 其中具体任务的是由插件来完成,maven为大多数构建任务编写并绑定了插件,如针对编译的插件:maven-compiler-plugin。用户也可自行配置或编写插件。

maven定义了三套生命周期,clean、defaule和site,其中每个生命周期又包含了一些阶段(phrase),每个生命周期之间是相互独立的, 但每个生命周期的阶段都是按顺序执行,且后面的阶段依赖于前面的阶段,执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。

clean生命周期包括以下阶段

pre-clean:执行清理前的工作

clean:清理上一次构建生成的所有文件

post-clean:执行清理后的工作

default生命周期

default生命周期是最核心的,它包含了构建项目时需要执行的所有步骤,包括以下阶段

  1. validate
  2. initialize
  3. generate-sources
  4. process-sources
  5. generate-resources
  6. process-resources    :复制和处理资源文件到target目录,准备打包;
  7. compile    :编译项目的源代码;
  8. process-classes
  9. generate-test-sources
  10. process-test-sources
  11. generate-test-resources
  12. process-test-resources
  13. test-compile    :编译测试源代码;
  14. process-test-classes
  15. test    :运行测试代码;
  16. prepare-package
  17. package    :打包成jar或者war或者其他格式的分发包;
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install    :将打好的包安装到本地仓库,供其他项目使用;
  23. deploy    :将打好的包安装到远程仓库,供其他项目使用;

1 . 3 site生命周期,包括以下阶段 

 pre-site:执行生成站点前的工作

site:生成项目的站点文档

post-site:执行生成站点后的工作

deploy-site:将生成的项目站点文档发布到服务器上

maven插件

插件的目标

一个插件通常可以完成很多任务,每一个任务就叫做插件的一个目标

将插件绑定到生命周期上

生命周期是抽象的,具体的任务要通过插件去完成,而这一过程是通过将插件目标绑定到生命周期的具体阶段来完成

如:

            <phase>package</phase>

//具体见插件介绍
            <goals>
            <goal>jar-no-fork</goal>
            </goals>

 

插件见网址:http://maven.apache.org/plugins/index.html

使用:比如

 用于将项目打包成源码

在pom.xml中的配置

<build>
  <plugins>
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-source-plugin</artifactId>
  <version>3.0.1</version>
  <executions>
  <execution>

//在执行哪个阶段时使用该插件
            <phase>package</phase>

//具体见插件介绍
            <goals>
            <goal>jar-no-fork</goal>
            </goals>
          </execution>
  </executions>
  </plugin>
  </plugins>
  </build>

9、pom.xml详解

1、什么是pom.xml文件

1、第一种定义:pom.xml主要描述maven的运行时环境、坐标、依赖关系、开发者需要遵循的规则、缺陷管理系统、组织和licenses,以及其他与 项目有关的因素,是项目级别的配置文件。

POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。

2、标签详解

<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">
  <!--pom文件的版本,固定-->
  <modelVersion>4.0.0</modelVersion>
<!--坐标-->
<!--反写公司网址+项目名-->
  <groupId>com.imooc.maven03</groupId>
  <!--项目名+模块名-->
  <artifactId>model</artifactId>
  <!-- 项目版本
  0:表示大版本号
  0:分支版本号
  1:小版本号 
  种类:
  1、SNAPSHOT:快照版本
  2、alpha:内测
  3、beta:公测
  Release:稳定
  GA:正式发布
  -->
  <version>0.0.1-SNAPSHOT</version>
  <!--项目打包方式-->
  <packaging>jar</packaging>
<!--项目描述名-->
  <name>model</name>
  <!--项目地址-->
  <url>http://maven.apache.org</url>
  <!--项目描述-->
<description></description>
<!--项目开发者-->
<developers></developers>
<!--项目组织-->
<organization></organization>
<!--开源项目许可-->
<licenses></licenses>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
<!--项目依赖关系-->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
     <!--指这个jar包的依赖范围,比如junit jar包,若范围为test,则在main中不能使用这个jar包-->
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
  <plugins>
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-source-plugin</artifactId>
  <version>3.0.1</version>
  <executions>
  <execution>
            <phase>package</phase>
            <goals>
            <goal>jar-no-fork</goal>
            </goals>
          </execution>
  </executions>
  </plugin>
  </plugins>
  </build> 
</project>
 

在编写maven项目时,若要使用某个框架,则要将该框架的jar包引入classpath中,而在maven中为我们提供了三种classpath,分别为编译、测试、运行,而范围是用来控制依赖与三种classpath的关系,如  <scope>test</scope> 表明该依赖在测试时有效

scope的取值6个

compile:指该依赖在三种classpath上都有效

provided:容器或JDK已提供范围,表示在JDK或者容器中已经提供该依赖,只在编译和测试时加载或使用,在打包时不会包含在目标包中,最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。
 runtime:一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。

test:测试范围,一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等。

system:系统范围,与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath指定本地jar文件路径,所以该scope是不推荐的。如果是基于组织的,一般会建立本地镜像,会把本地的或组织的基础组件加入本地镜像管理,避过使用该scope的情况。

import:在 <dependencyManagement>这个标签中的<dependency>中使用
 依赖传递

若项目A依赖项目B,项目B依赖项目C,则项目A依赖项目C

例如:依赖于依赖于
 则若在项目的pom文件中添加对项目的依赖,则可实现它们之间的依赖关系

  <dependency>
    <groupId>com.imooc.maven03</groupId>
  <artifactId>maven03-dge</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    </dependency>

若此时在项目的pom.xml文件中添加对项目的依赖,则可实现它们之间的依赖关系,但由于

项目对项目的依赖,则项目对项目也有依赖,

若不想让有 依赖,可排除依赖,如

 <dependency>
    <groupId>com.imooc.maven03</groupId>
  <artifactId>maven03-nage</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <exclusions>
  <exclusion>
         <groupId>com.imooc.maven03</groupId>
         <artifactId>maven03-dge</artifactId>
        </exclusion>
  </exclusions>
    </dependency>

依赖冲突

即若A依赖于B依赖于C,且A、B同时依赖于一个版本不同的jar包,则此时C中的该jar包是哪个版本,这就是依赖冲突

有两条原则

1、短路优先:即依赖路径短的优先,如A——>B——>C,则C中的jar包和B版本相同,因为B的依赖路径更短

2、谁先声明谁优先:即若C同时依赖于A、B,则A、B谁在pom.xml文件中先声明,C的jar包就和谁版本相同

如:

上面那个例子

 <dependency>
    <groupId>com.imooc.maven03</groupId>
  <artifactId>maven03-dge</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>com.imooc.maven03</groupId>
  <artifactId>maven03-nage</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  </dependency>

依赖聚合和依赖继承

依赖聚合:即当有多个项目需要放入仓库中时,一个一个编译、打包、install太麻烦了,可以将多个居合道一个项目中进行

新建一个

配置文件

<packaging>pom</packaging>

<modules>
  <module>../maven03-dge</module>
  <module>../maven03-nage</module>
  <module>../maven03-shanji</module>
  </modules>

依赖继承:当多个项目都继承一个jar包时, 每个项目中的配置文件都写未免有些重复,因此使用依赖继承,新建一个项目作为父模块, 让其他子模块去继承它,由于它不执行,所以不需要main和test目录

如:

父模块pom.xml

<packaging>pom</packaging>

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>3.8.1</junit.version>
  </properties>

<dependencyManagement>
   <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  </dependencyManagement>

子模块

 <parent>
  <groupId>com.imooc.maven03</groupId>
  <artifactId>maven03-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <relativePath>../maven03-parent/pom.xml</relativePath>
  </parent>

如何构建WEB项目

1、新建一个maven项目

选中webapp模板

2、创建好之后,会报错,因为缺少servlet依赖,所以需导入,在maven的仓库中搜索servlet,并将给定的依赖配置复制到pom.xml文件中

 <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

3、由于此时src/main中没有java文件夹并且src下没有test文件夹,所以需创建

4、将classes文件的存放位置设置为target文件夹

右击项目——>选中build path——>source——>

若为这样既可

5、将该项目设置为web项目

右击项目——>properties——>Project Facets——>

6、设置部署中不含test文件夹

删去test文件夹既可

7、在pom.xml中配置tomcat插件,以便打包时将该项目发布到tomcat上

tomcat插件:在tomcat官网

pom.xml配置

<plugins>
  <plugin>
  <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
          </executions>
  </plugin>
  </plugins>

说明:此插件只用于tomcat6/7,不用于tomcat8

8、测试

将该项目打包,即执行 clean package命令,接着访问该项目,看是否能访问到,即地址栏上输入如:

http://localhost:8080/webappdemo/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值