maven基本使用-个人手稿版

举报
bayabayabaluobo 发表于 2021/01/27 15:33:51 2021/01/27
【摘要】  一.项目会遇到什么事情?1,构建:编译代码,运行测试,打包,部署应用,运行服务器等;2,依赖:项目依赖大量的第三方包,第三方包又依赖另外的包;对依赖包的管理非常麻烦; Maven能做什么事情?1,Maven翻译为“知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具;2,Maven主要用作基于Java平台的项目(Maven本身也是Java编写的)的构建、依赖包管理和项目信息管理;3...


 

一.项目会遇到什么事情?

1,构建:编译代码,运行测试,打包,部署应用,运行服务器等;

2,依赖:项目依赖大量的第三方包,第三方包又依赖另外的包;对依赖包的管理非常麻烦;

 

Maven能做什么事情?

1,Maven翻译为“知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具

2,Maven主要用作基于Java平台的项目(Maven本身也是Java编写的)的构建、依赖包管理和项目信息管理;

3,Maven能提供一种项目的配置,配置好的项目,只需要运行一条简单的命令,就能完成重复的,繁琐的构建动作;

4,Maven能提供一种项目的依赖配置,配置好的项目,Maven能自动的从Maven的中央仓库中帮我们下载并管理项目依赖的jar包,并且还能自动的管理这些jar包依赖的其他jar包;

5,Maven提供了一种标准的项目目录结构,测试命名规则等项目的最佳实践方案,统一了不同项目的学习成本(约定大于配置);

 

二.为什么用Maven?

IDE/Eclipse:

1,手工操作较多,编译、测试、部署等工作都是独立的,很难一步完成

2,每个人的IDE配置都不同,很容易出现本地代码换个地方编译就出错

3,每个项目的依赖包必须自己维护了管理

Ant:

1,没有一个约定的目录结构

2,必须明确让ant做什么,什么时候做,然后编译,打包

3,没有生命周期,必须定义目标及其实现的任务序列

4,没有集成依赖管理

  • Maven的安装

1.检查JDK安装的情况(1.6以上的版本):

添加JAVA_HOME,需要指向JDK安装目录;

配置CLASSPATH的:变量名:CLASSPATH。变量值:设置为.;%JAVA_HOME%/lib

添加PATH,添加%JAVA_HOME%\BIN;

 

 

 

 

 

2.安装maven

 

设置系统环境变量,MAVEN_HOME,指向maven的根目录

 

设置环境变量Path,将%MAVEN_HOME%\bin加入Path

 

注意:所有标点均为英文下标点

配置成功后,在cmd中输入mvn -v 就出现如下信息,表示配置成功

 

C:\Users\Administrator\Desktop>mvn -v

Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1;

2014-12-15T01:29:23+08:00)

Maven home: E:\javaStudy\software\maven\apache-maven-3.2.5\bin\..

Java version: 1.8.0_31, vendor: Oracle Corporation

Java home: E:\javaStudy\software\JDK

Default locale: zh_CN, platform encoding: GBK

OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"

  • maven的文件结构

 

bin:包含了Maven的运行脚本文件;

boot:Maven的依赖的类加载器;

conf:非常重要,Maven的全局配置文件(settings.xml),定制Maven的运行行为

 

lib:Maven依赖的jar包(里面的maven-model-builder-3.2.5.jar重要,后面再介绍)

 

.m2文件夹

运行一个maven命令:mvn help:system,观察maven的执行动作;

在用户的个人文件夹下,生成一个.m2文件夹,文件夹里面有一个repository文件夹,里面是刚下载的jar文件;

最佳实践:将仓库地址重新定位

1,将maven的conf/settings.xml拷贝到.m2中;作为个人MAVEN配置文件;

2,重新定位repository目录地址:<localRepository>配置;

 

 

  • Maven的简单使用

1.hello maven项目

1Maven规定了一套默认的项目格式:

src/main/java —— 存放项目的.java文件

src/main/resources —— 存放项目资源文件,如springstruts2配置文件,db.properties

src/main/webapp —— 存放jspcssimage等文件

src/test/java —— 存放所有测试.java文件,如JUnit测试类

src/test/resources —— 测试资源文件

pom.xml——主要要写的maven配置文件

target —— 项目由maven自动输出位置

 

2)按照下面的目录结构创建一个目录结构:

 --src

 -----main

 ----------java

 -----test

 ----------java

 --pom.xml

 

3)编写下面的Java类:

1)在src/main/java下添加类:

package cn.xmg.maven;

public class Hello {

public String sayHello(String name){

return "Hello Maven World!";

}

}

2)在src/test/java下添加类:

package cn.xmg.maven;

import org.junit.Test;

import static junit.framework.Assert.*;

public class HelloTest {

@Test

public void testHello(){

Hello hello = new Hello();

String results = hello.sayHello("World");

assertEquals("Hello World!",results);

}

}

4)编辑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>cn.xmg.maven</groupId>

<artifactId>Hello</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>Hello</name>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.9</version>

<scope>test</scope>

</dependency>

</dependencies>

</project>

 

5)切换到项目根目录下,用cmd分别执行下列命令并观察:

1)执行 mvn compile命令

编译项目

  • 执行mvn clean命令

清空编译好的东西

  • 执行mvn clean compile命令

先清空后编译

4)执行mvn clean test命令

进行测试

5)执行mvn clean package命令

将项目打包

6)执行mvn clean site命令

生成文档

  • 执行mvn install命令

将自己的项目打包jar包并上传到本地仓库,上传地址和pom.xml配置文件中相同,如下:

 

<modelVersion>4.0.0</modelVersion>

<groupId>cn.xmg.maven</groupId>

<artifactId>Hello</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>Hello</name>

 

Maven帮我们下载的jar包的目录和pom.xml配置文件相对应

 

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.9</version>

<scope>test</scope>

</dependency>

也就是说,可以在pom.xml中配置的jar包目录,使用自己上传的jar包,按照这样的格式去配置pom.xml文件。

 

pom.xml配置文件中追加配置,将自己上传的项目jar包作为jar包被引用。然后删除cn\xmg\maven目录下的Hello.java文件,然后重新进行测试。

能够测试成功说明该测试已经将自己项目打包生成的jar包引用了。

使用maven很重的一点就是使用这样的一种项目与项目间的依赖关系。

 

附录:

可以通过MAVEN的命令来生成Maven项目骨架:

执行命令mvn archetype:generate

 

可以看到有很多的archetype,每个前面有一个序号,输入序号(或者直接回车,选的就是quick-start):

 

 

一次输入需要的内容,

项目创建成功

 

 

2,一次性生成

mvn archetype:create -DgroupId=[your group id] -DartifactId=[your archetype id] -DarchetypeArtifactId=maven-archetype-webapp

 

3,如果mvn archetype:generate列出内容过多,或者下载过慢,运行:

mvn archetype:generate -DarchetypeCatalog=internal

只列出系统内部有的archetype

 

 

四.eclipse/myeclipse + maven

1.myeclipse中安装maven插件

 

将这三个插件文件复制到myeclipse/eclipse安装目录下的dropins目录,重启myeclipse/eclipse即可;

  • Maven插件基本配置

 

 

 

 

  • 使用
  • 导入已经存在的maven项目

 

  • 新建maven项目

在工作空间: new--others--

 

 

 

 

 

 

  • Maven中一些重要概念

1.坐标:

Maven中坐标就是用来规范maven唯一标示一个构建的方法;

Maven坐标构成:

1groupId:项目名称

2artifactId:项目中Maven项目/模块名称

3version:项目版本

4packing:打包的方式,比如jar、war、pom等;

5classifier:附属构件,比如source,javadoc等,但是注意,一般不会直接定义classifier,附加构件不是直接定义的,是插件帮助构件的;

 

生成的文件名是根据坐标生成的,规则:artifactId-version[-classifier].packing

在仓库中的位置也是根据坐标生成的,后面再介绍;

 

2.配置依赖:

1一个较完整的依赖配置包括

<dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <type></type>

      <scope>test</scope>

      <optional></optional>

      <exclusions>

       <exclusion></exclusion>

      </exclusions>

</dependency>

groupId:该依赖项目的groupId;

artifactId:该依赖项目的artifactId;

version:该依赖项目的版本;(也是通过这三个坐标找到jar包位置)

type:依赖项目的类型,对应坐标中的packing,即文件类型,一般不填,默认为jar;

scope:该依赖项目的依赖范围;

optional:标记依赖是否可选;

exclusion:设置排除依赖传递性;

1scope

--》Maven在编译,测试,运行的时候,各需要一套classpath;(比如编译的时候会有编译的classpath;测试的时候会有测试的classpath;)scope表明该依赖的项目和三个classpath的关系

 

--》scope的可选值:

1)compile:默认,绑定编译classpath;注意,编译classpath在编译,测试,运行时都有效;

2)test:绑定测试classpath;

3)provided:运行时已提供;绑定编译和测试的classpath;运行时无效;典型的如servlet-api.jar

4)runtime:测试,运行时有效;典型的如jdbc具体驱动实现;

5)import:(maven继承中使用,不讲)

 

--》依赖的传递性:

1)测试junit4.8和junit4.9的区别;并查看Junit4.9依赖项目中的pom.xml文件;

2)依赖的分类;A->B(第一直接依赖);B->C(第二直接依赖);A->C(传递依赖)

3)依赖的传递:

(第二依赖) compile                test                  provided                  runtime

(第一依赖)

compile                        compile                 N                                                    compile

test                              test                        N                                                   test

provided                      provided                N                   provided                   provided

runtime                        runtime                  N                                                    runtime

 

 

 

  • Optional

依赖的可选:可选项目不会被传递;

如果A项目依赖B项目;B项目依赖C或者D(比如一个基础项目,兼容了MYSQL或者ORACLE,那么他可能依赖mysql-connector或者classes12.jar)

但是在A项目运行的时候,只需要C或者D其中一个就可以了。那么对于B项目来说,C和D项目就可以设置optional为true;在A项目中单独设置C或者D的依赖;

 

 

  • Exclusion

exclusions:排除一个或多个传递性依赖;

传递性依赖可能带来的问题:

A->B1;C->B2;那么项目中会有两个B项目;如果包不存在冲突,那么就可以保留一个高版本的B版本即可;在A项目中:

<dependency>

<groupId>org.xxx</groupId>

        <artifactId>A</artifactId>

        <version>1.1</version>

<exclusions>

<exclusion>

<groupId>org.xxx</groupId>

<artifactId>B</artifactId>

</exclusion>

</exclusions>

</dependency>

 

 

2)最佳实践

1使用properties归类版本:

<properties>

<org.springframework.version>3.0.5.RELEASE</org.springframework.version>

</properties>

 

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>${org.springframework.version}</version>

<scope>test</scope>

</dependency>

 

2依赖的分析:

mvn dependency:analyze

mvn dependency:tree

 

  • 仓库

仓库用于统一管理和存放依赖包的地方;

仓库中依赖包存放的方式和坐标的对应关系:groupId/artifactId/version/artifactId-version.packing

仓库的分类:本地仓库和远程仓库;组件仓库和插件仓库;

           

maven仓库  ——   本地仓库

                 |——   远程仓库  ——  中央仓库

 |—— 私服

 |—— 其他公共库

 

超级POM中:

  <repositories>

    <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>

  </repositories>

id:仓库的id,只有中央仓库id为central,仓库的id必须唯一,如果其他仓库id覆盖central,则相当于覆盖了中央仓库;

url:仓库的URL地址;

layout:仓库的布局,MAVEN2以上都用default;

snapshots:代表不从中央仓库中下载快照版本;

 

可以在POM中配置其他的公共仓库;

 

仓库的镜像:如果一个仓库完全和中央仓库同步,我们就可以选择本地的这种仓库作为中央仓库的镜像仓库;

settings.xml中配置:

<mirror>

      <id>maven.cn</id>

      <mirrorOf>central</mirrorOf>

      <name>cn</name>

      <url>http://maven.net.cn/content/groups/public/</url>

</mirror>

 

<mirrorOf>:

*:匹配所有的仓库(比如配置私服)

external:*:所有远程仓库(localhost,file除外);

rep1,rep2:仓库1和仓库2;

*,!rep1:除了仓库1其他所有的;

 

仓库的搜索:

http://www.mvnrepository.com/

 

  • 生命周期

Maven的生命周期是抽象的,比如当我们执行mvn clean实际上会执行一系列的动作,这些动作就是生命周期;

Maven的生命周期由多个阶段构成,在Maven中有以下几套生命周期:

1,clean(清理,对应clean):

pre-clean:执行清理前要做的事情

clean:执行清理动作

post-clean:清理后要做的事情

 

2,default:(构建,对应install)

validate:

initialize:初始化工作

generate-sources:

process-sources: 复制并处理资源文件,至目标目录,准备打包。

compile: 编译项目的源代码。

process-classes:

generate-test-sources:

process-test-sources:复制并处理资源文件,至目标测试目录。

test-compile:编译测试源代码。

process-test-classes:在测试前的工作

test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

prepare-package:执行打包前的工作

package:接受编译好的代码,打包成可发布的格式,如 JAR 。

pre-integration-test:集成测试前工作;

integration-test:执行集成测试;

post-integration-test:集成测试后的工作;

verify:

install:将包安装至本地仓库,以让其它项目依赖。

deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

 

3,site(站点,对应site)

pre-site:执行一些需要在生成站点文档之前完成的工作

site:生成项目的站点文档

post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

site-deploy:将生成的站点文档部署到特定的服务器上

 

命令行和生命周期的对应:

1,注意,命令行不是和生命周期一一对应,可能一个命令行只执行了一个生命周期的部分阶段;

2,mvn clean:对应clean周期的clean之前的东西;

3,mvn test:对应default周期的test之前的阶段;

4,mvn clean install:对应clean+default周期的install之前的;

 

注意:生命周期中不是每个阶段都有事情做!!!!!

 

 

  • 插件目标和插件

1,Maven中只定义了生命周期,而生命周期中每个步骤怎么做,是需要插件来完成的;

2,一个插件往往能执行多个功能,插件的每一个功能,就叫做插件的目标;

3,插件绑定:插件的目标需要和生命周期中的某个阶段绑定,才能完成一定的任务,插件绑定分两种:

    1)内置绑定:比如,maven-clean-plugin:clean,(比如我们可以直接执行mvn org.apache.maven.plugins:maven-clean-plugin:clean插件)

2)自定义绑定:可以通过<plugin>的<execution>元素把插件目标绑定在生命周期上;

<plugin>

<groupId>org.mortbay.jetty</groupId>

<artifactId>jetty-maven-plugin</artifactId>

<executions>

<execution>

<phase>process-test-classes</phase>

<goals>

<goal>start</goal>

</goals>

</execution>

</executions>

</plugin>

4,内置绑定的执行:

1,比如mvn dependency:tree,等价于执行mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree;在这里其实就可以看到groupId,artifactId,version都存在了;

    2,怎么定位插件仓库?

1,插件是单独放在插件仓库之中的;

2,默认的插件groupId都是org.apache.maven.plugins;

        3,在插件库中找到org\apache\maven\plugins,里面有一个maven-metadata-central.xml;

<plugin>

      <name>Apache Maven Clean Plugin</name>

      <prefix>clean</prefix>

      <artifactId>maven-clean-plugin</artifactId>

    </plugin>

<plugin>

      <name>Apache Maven Compiler Plugin</name>

      <prefix>compiler</prefix>

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

    </plugin>

在这里就能找到artifactId;

 

 

  • 私服

掌握nexus私服的搭建和配置;

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。