Maven
是一个项目管理工具,它的本质是一个项目对象模型(POM),体如今配置中就是咱们常见的 pom.xml
文件,而这个 pom
文件就是 Maven
的核心,它管理了整个项目的生命周期。它主要作两件事:html
Maven
诞生时就提出了一个仓库的概念,项目中用到的第三方 jar
包,咱们在 pom.xml
中配置好依赖便可,Maven
会自动到它的官方中央仓库下载这个 jar
包到咱们的本地仓库。Java
发展至今,生态很是完善。咱们在项目中用到什么功能,网上一搜确定有对应的 jar
包,各类功能就致使了各类 jar
包的引入,这些 jar
包之间可能会有依赖,可能会有版本冲突。而 Maven
的诞生解决了这些问题。Maven
的一键构建项目帮咱们解决了这个问题。maven
的时代,团队协做要上传、下载一大堆 jar
包导入项目,耗时、费力。而有了 maven
,咱们只须要同步一下 pom
文件便可同步 jar
包。这是 maven
解决的第三个问题。这个就不讲了,网上不少资料。好比:https://www.cnblogs.com/KyleXu/p/9972042.html前端
Maven
的配置比较简单,主要是修改 conf
文件夹下的 setting
文件。配置如下三个仓库:java
本地仓库python
项目依赖的 jar
包是须要下载到本地才能用的。本地仓库就是从 maven 私服或者远程仓库下载的 jar
的存储地址,默认是 当前用户名\.m2\repository
,我建议改个好记的地方,后面方便检查包有没下载到本地。打开 setting.xml
搜索 localRepository
修改为自定义的地址。mysql
<localRepository>D:\Repository</localRepository>
配置的位置,以下图:linux
私服仓库c++
这个仓库的话,通常就是公司内部使用的啦。用来存储公司内部本身的 jar
包。打开 setting.xml
文件搜索 mirrors
,配置公司的镜像地址便可。算法
<mirror> <id>nexus-repos</id> <mirrorOf>*</mirrorOf> <name>Team Nexus Repository</name> <url>http://127.0.0.1:8081/nexus/content/groups/public</url> </mirror>
远程仓库spring
远程仓库就是一个 maven
官方维护的,包含大量 jar
包的仓库。这个库默认是 maven 官方的,可是下载很是慢。因此业界典范阿里巴巴也推出了一个国内的镜像,咱们通常把远程仓库配成阿里的镜像地址,就能够快速地下载 jar
包啦。和私服仓库同样,远程仓库也是配置在 <mirrors>
标签内。sql
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
配置的位置,以下图:
有人可能问了,配置那么多个仓库。究竟 jar
从哪一个下载的呀?都把我搞糊涂了,别急,我花了个流程图,它的查找顺序是这样的:本地不须要网络,优先从本地找;找不到,再去速度较高的内网私服找;而后才是速度稍低的外网远程仓库找。
经常使用命令
命令 | 含义 | 备注 |
---|---|---|
mvn clean | 清除 | 打包前,清空上一次的包 |
mvn compile | 编译 | 将 java 代码编译成 class 文件 |
mvn test | 测试 | 运行单元测试 |
mvn install | 安装到本地 | 安装到本地仓库,通常是 jar 包 |
mvn package | 打包 | 通常会在 target 目录下生成包,jar 或 war |
mvn deploy | 上传 | 上传到私服,需在 setting.xml 文件配置私服仓库以及帐号密码 |
以上就是 maven
经常使用的命令,要注意的是:不多状况下咱们只运行其中一个命令,都是组合运行的。好比打包到本地,打包前得清空原有的包吧?那组合起来就是 mvn clean
+ mvn install
固然,在 IDEA
中开发 maven
项目,咱们并不须要手打。只需点击对应命令便可(也能够按住 ctrl
选中多个命令一块儿运行)
总而言之,根据本身的需求来选择打包命令。还有其余的命令请见:
建立 maven 项目
如今通常都是配合 idea
新建 maven 项目了,这个命令用得不多,但咱们仍是得知道一下:生成 maven
项目的原理是,依赖一个插件 maven-archetype-plugin
,而后这个插件自带一些 archetype
模版,也能够说成项目的骨架。其中:-DgroupId
和 -DartifactId
填写本身想好的项目坐标,通常 -DgroupId
是公司名的翻转,好比 com.google
而 -DartifactId
就是项目的名称了。最重要的是-DarchetypeArtifactId
,他指定了建立的骨架。
mvn archetype:generate -DgroupId=com.nasus -DartifactId=maven-test -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
点进去,只有 src
文件夹和 pom.xml
文件:src
是最重要的目录,代码和测试用例以及资源都是放在这里的,对于 maven 项目而言,pom.xml
也是必不可少的。
用 idea
打开的项目结构是这样的:
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/maven-v4_0_0.xsd"> <!--声明项目描述符遵循哪个 POM 模型版本,上面的 xsd 规范定义了这个版本,默认就行,不须要修改,不可删除--> <modelVersion>4.0.0</modelVersion> <!--团体惟一标识符--> <groupId>com.nasus</groupId> <!--项目惟一标识符定位这个包--> <artifactId>maven-test</artifactId> <!--打包类型--> <packaging>jar</packaging> <!--打包版本--> <version>1.0-SNAPSHOT</version> <!--包名--> <name>maven-test</name> <!--不用管,删掉也行--> <url>http://maven.apache.org</url> <!--项目须要依赖的 jar 包--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
因为篇幅缘由,这里就不详细讲具体的 pom.xml
标签了,详细介绍请看:
项目打包到本地仓库
因为项目是 java
项目,在打包前,咱们要在 pom.xml
中配置项目的 JDK
版本以及 maven
插件版本,在 <dependencies>
标签前加入项目属性配置,完整配置以下:
<!--项目属性,在 <dependencies> 前加--> <properties> <!-- JDK编译版本 --> <java.version>1.8</java.version> <!-- 项目编码 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- JDK编译版本 --> <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> <!--项目须要依赖的 jar 包--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
选择命令,这里我选了 clean、compile、package
:
点击绿色执行按钮,在 target
目录下生成 maven-test-1.0.SNAPSHOT.jar
:
跳过单元测试
在开发中,咱们常常须要本地测试,而这时咱们是不须要跑单元测试的。因此,咱们能够跳过单元测试:选中 test
,点击红框按钮便可。
手动打 jar 包到本地仓库
手动打 jar
包的应用场景是:开发公司旧项目,当找不到依赖的 jar
源码,依赖的 jar
又没有上传到仓库,只有在同事电脑的本地仓库有一个 jar
包时,咱们能够直接运行这条命令把 jar
包打到咱们电脑本地仓库,愉快的使用起来。
mvn install:install-file -Dfile=jar包的路径 -DgroupId=gruopId中的内容 -DartifactId=actifactId的内容 -Dversion=version的内容 -Dpackaging=jar
maven 经过 pom.xml 来进行依赖管理,咱们用它来描述项目的依赖属性。能够把它看做是 maven 项目的地图,它描述了 jar 包的坐标、版本以及依赖关系等。若是不肯定你想要引入 jar 的坐标怎么写,能够上 maven 中央仓库查询:
maven 的第三方依赖都在 <dependencies>
标签内定义,该标签下的 <dependency>
包裹的内容就是一个 jar
的坐标,以下 pom 就引入了 junit
和 cglib
两个 jar
。下面就说一下每一个坐标的标签都表明什么。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version> </dependency> </dependencies>
在 dependencies 标签中,添加项目须要的 jar 所对应的 maven 坐标。
一个 dependency 标签表示一个坐标,也就是一个 jar,在 pom 中引入一个 jar 能够这样写:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
公司、团体、我的开发者的惟一标识符,maven 约束它以建立这个项目的组织名称的逆向域名开头,好比开发者的域名是 nasus.com
那他的惟一标识符就是 com.nasus
。
<!--团体惟一标识符--> <groupId>com.nasus</groupId>
项目惟一标识符,一个组织可能有多个项目,为了方便 maven 引入,maven 约定以项目名称命名该标识符,好比我开发的 maven-test 项目。
<!--项目惟一标识符--> <artifactId>maven-test</artifactId>
项目的版本。一个项目,可能会有多个版本。若是是正在开发的项目,咱们能够给版本号加上一个 SNAPSHOT,表示这是一个快照版本。
什么是快照?
对于版本,若是 maven
之前下载过指定的版本文件,好比说 maven-test:1.0
,maven
将不会再从仓库下载新的可用的 1.0
文件。若要下载更新的代码,maven-test
的版本须要升到 1.1
。
快照是一种特殊的版本,指定了某个当前的开发进度的副本。不一样于常规的版本,maven
每次构建都会在远程仓库中检查新的快照。咱们本身的模块依赖了同事开发的模块,正常来讲,同事会每次发布更新代码的快照到仓库中。
新建项目的默认版本号就是快照版,好比上面用 maven 命令新建的 maven-test 项目:
maven 项目不一样的阶段引入到 classpath 中的依赖是不一样的,例如,编译时,maven 会将与编译相关的依赖引入 classpath 中,测试时,maven 会将测试相关的的依赖引入到 classpath 中,运行时,maven 会将与运行相关的依赖引入 classpath 中,而依赖范围就是用来控制依赖于这三种 classpath 的关系。 以下图所示:
scope 表示依赖的范围,它有 compile(编译阶段)、test(测试阶段)、provided(供应阶段)、runtime(运行阶段)、system(系统阶段)、import(导入阶段)
六个可选值。其中 compile
是默认的。system
和 import
用得少,不详细讲。
不一样依赖的适用范围不同,举几个最典型的栗子:
范围 | 编译有效 | 测试有效 | 运行时有效 | 打包有效 | 示例 |
---|---|---|---|---|---|
compile | 是 | 是 | 是 | 是 | spring-core |
test | 否 | 是 | 否 | 否 | junit |
provided | 是 | 是 | 否 | 否 | javax.servlet-api |
runtime | 否 | 是 | 是 | 是 | JDBC驱动 |
spring-core
servlet-api
编译和测试项目的时候须要该依赖,但在运行项目的时候,因为容器已经提供,就不须要 maven
重复地引入一遍:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> <scope>runtime</csope> </dependency>
以下 xml,原来的定义中已引入 commons-net
依赖,而 hermes-ftp
中又依赖了 commons-net
,为避免版本冲突,咱们能够排除 hermes-ftp
中的 commons-net
依赖。
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency> <dependency> <groupId>com.nasus.greece.jupiter</groupId> <artifactId>hermes-ftp</artifactId> <version>1.1.0-SNAPSHOT</version> <!--排除 commons-net 依赖--> <exclusions> <exclusion> <artifactId>commons-net</artifactId> <groupId>commons-net</groupId> </exclusion> </exclusions> </dependency>
假设有以下项目关系:WebMavenDemo
项目依赖 JavaMavenService1
,JavaMavenService1
项目依赖 JavaMavenService2
。
pom.xml 文件配置好依赖关系后,必须首先 mvn install 后,依赖的 jar 包才能使用。好比:
WebMavenDemo
的 pom.xml
文件想能编译经过,JavaMavenService1
必须 mvn install
JavaMavenService
的 pom.xml
文件想能编译经过,JavaMavenService2
必须 mvn install
传递性:
假设咱们如今 JavaMavenService2
增长 spring-core
,那就会发现WebMavenDemo
和 JavaMavenService1
也会自动的增长了这个jar
包,这就是依赖的传递性。
注意:非
compile
范围的依赖是不能传递的。
在上面介绍 pom 文件时,咱们讲过 properties
标签,它还有一个做用就是限定依赖的 jar 包版本,它经常使用在父项目中指定版本号,那么子项目用到该包就避免了版本不一致形成的依赖冲突,它的写法是这样的:
maven 打 war 包时,可能须要一些额外的配置,请参看如下 xml 文件:
<build> <!-- 项目的名字 --> <finalName>maven-test</finalName> <!-- 描述项目中资源的位置 --> <resources> <!-- 自定义资源1 --> <resource> <!-- 资源目录 --> <directory>src/main/java</directory> <!-- 包括哪些文件参与打包 --> <includes> <include>**/*.xml</include> </includes> <!-- 排除哪些文件不参与打包 --> <excludes> <exclude>**/*.txt</exclude> <exclude>**/*.doc</exclude> </excludes> </resource> </resources> <!-- 设置构建时候的插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <!-- 源代码编译版本 --> <source>1.8</source> <!-- 目标平台编译版本 --> <target>1.8</target> </configuration> </plugin> <!-- 资源插件(资源的插件) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.1</version> <executions> <execution> <phase>compile</phase> </execution> </executions> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- war插件(将项目打成war包) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1</version> <configuration> <!-- war包名字 --> <warName>maven-test</warName> </configuration> </plugin> </plugins> </build>
这个网上不少资料,不讲了。留个连接。
若是看到这里,喜欢这篇文章的话,请转发、点赞。微信搜索「一个优秀的废人」,欢迎关注。
回复「1024」送你一套完整的 java、python、c++、go、前端、linux、算法、大数据、人工智能、小程序以及英语教程。
回复「电子书」送你 50+ 本 java 电子书。