maven基本使用-个人手稿版

网友投稿 702 2022-05-29

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

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的根目录

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目录地址:配置;

Maven的简单使用

1.hello maven项目

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

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

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

src/main/webapp —— 存放jsp,css,image等文件

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

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

4.0.0

cn.xmg.maven

Hello

0.0.1-SNAPSHOT

Hello

junit

junit

4.9

test

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配置文件中相同,如下:

4.0.0

cn.xmg.maven

Hello

0.0.1-SNAPSHOT

Hello

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

junit

junit

4.9

test

也就是说,可以在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坐标构成:

1)groupId:项目名称

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

3)version:项目版本

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

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

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

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

2.配置依赖:

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

junit

junit

3.8.1

test

groupId:该依赖项目的groupId;

artifactId:该依赖项目的artifactId;

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

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

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

optional:标记依赖是否可选;

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

(1)scope

--》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项目中:

org.xxx

A

1.1

org.xxx

B

2)最佳实践

(1)使用properties归类版本:

3.0.5.RELEASE

org.springframework

spring-test

${org.springframework.version}

test

(2)依赖的分析:

mvn dependency:analyze

mvn dependency:tree

仓库

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

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

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

maven仓库  ——   本地仓库

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

|—— 私服

|—— 其他公共库

超级POM中:

central

Central Repository

https://repo.maven.apache.org/maven2

default

false

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

url:仓库的URL地址;

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

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

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

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

在settings.xml中配置:

maven.cn

central

cn

http://maven.net.cn/content/groups/public/

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

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)自定义绑定:可以通过元素把插件目标绑定在生命周期上;

org.mortbay.jetty

jetty-maven-plugin

process-test-classes

start

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;

Apache Maven Clean Plugin

clean

maven-clean-plugin

Apache Maven Compiler Plugin

compiler

maven-compiler-plugin

在这里就能找到artifactId;

私服

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

Java Maven

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:技术分享 | Spring Boot 集成 Swagger
下一篇:准备校招,关于JAVA 异常,面试看这篇就够了
相关文章