下载与安装

Maven下载地址http://maven.apache.org/download.cgi
Java基础——Maven - 图1

Linux 安装

  1. # cd /usr/local
  2. # mkdir maven
  3. # cd maven
  4. # wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
  5. # tar -zxvf apache-maven-3.6.0-bin.tar.gz

配置环境变量

  1. # vim /etc/profile
  2. export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.0
  3. export PATH=$PATH:$MAVEN_HOME/bin
  4. $ source ~/.bashrc

验证安装结果

  1. $ mvn -v
  2. Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
  3. Maven home: /usr/local/maven/apache-maven-3.6.0
  4. Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_191-amd64/jre
  5. Default locale: zh_CN, platform encoding: UTF-8
  6. OS name: "linux", version: "4.19.13-300.fc29.x86_64", arch: "amd64", family: "unix"

Mac 安装

  1. brew install maven

验证安装结果

  1. $ mvn -v
  2. Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
  3. Maven home: /usr/local/Cellar/maven/3.5.4/libexec
  4. Java version: 1.8.0_121, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
  5. Default locale: zh_CN, platform encoding: UTF-8
  6. OS name: "mac os x", version: "10.13.6", arch: "x86_64", family: "mac"

maven目录结构

目录结构 说明
src/main/java application library sources - java源代码文件,会自动编译到classes文件夹下
src/main/resources application library resources - 资源库,会自动编译到classes文件夹下
src/main/filters resources filter files - 资源过滤文件
src/main/assembly assembly descriptor - 组件的描述配置,如何打包
src/main/config configuration files - 配置文件
src/main/webapp java web应用的目录,包含WEB-INF,js,css等
src/main/bin 脚本库
src/test/java 单元测试java源代码文件
src/test/resources 测试需要的资源库
src/test/filters 测试资源过滤库
src/site 一些文档
pom.xml 工程描述文件
target/ 存放项目构建后的文件和目录,jar包,war包,编译的class文件等;Maven构建时生成的

HelloWorld

创建项目目录,

  1. mkdir mavenDomo/src/main/java/com/baxiang

在baxiang文件下增加HelloWorld.java

  1. $vim HelloWorld.java
  2. package com.baxiang;
  3. public class HelloWorld{
  4. public static void main(String[] args)
  5. {
  6. System.out.println("Hello World!");
  7. }
  8. }

在工程项目mavenDemo目录下增加pom.xml文件,与src在同一个目录下

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.baxiang</groupId>
  5. <artifactId>mavenDemo</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. </properties>
  11. </project>

最终目录结构

  1. $ tree
  2. ├── pom.xml
  3. └── src
  4. └── main
  5. └── java
  6. └── com
  7. └── baxiang
  8. └── HelloWorld.java
  9. 5 directories, 2 files

编译mavenDemo

  1. mvn package
  2. [INFO] Scanning for projects...
  3. [INFO]
  4. [INFO] -----------------------< com.baxiang:mavenDemo >------------------------
  5. [INFO] Building mavenDemo 1.0-SNAPSHOT
  6. [INFO] --------------------------------[ jar ]---------------------------------
  7. [INFO]
  8. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mavenDemo ---
  9. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  10. [INFO] skip non existing resourceDirectory /Users/baxiang/Documents/Project/maven/mavenDomo/src/main/resources
  11. [INFO]
  12. [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ mavenDemo ---
  13. [INFO] Changes detected - recompiling the module!
  14. [INFO] Compiling 1 source file to /Users/baxiang/Documents/Project/maven/mavenDomo/target/classes
  15. [INFO]
  16. [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mavenDemo ---
  17. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  18. [INFO] skip non existing resourceDirectory /Users/baxiang/Documents/Project/maven/mavenDomo/src/test/resources
  19. [INFO]
  20. [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ mavenDemo ---
  21. [INFO] No sources to compile
  22. [INFO]
  23. [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mavenDemo ---
  24. [INFO] No tests to run.
  25. [INFO]
  26. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mavenDemo ---
  27. [INFO] Building jar: /Users/baxiang/Documents/Project/maven/mavenDomo/target/mavenDemo-1.0-SNAPSHOT.jar
  28. [INFO] ------------------------------------------------------------------------
  29. [INFO] BUILD SUCCESS
  30. [INFO] ------------------------------------------------------------------------
  31. [INFO] Total time: 2.484 s
  32. [INFO] Finished at: 2018-09-01T13:54:16+08:00
  33. [INFO] ------------------------------------------------------------------------

测试编译结果

  1. $ java -cp target/mavenDemo-1.0-SNAPSHOT.jar com.baxiang.HelloWorld
  2. Hello World!

快速构建项目骨架

执行mvn archetype:generate

  1. Choose archetype:
  2. 1: internal -> org.apache.maven.archetypes:maven-archetype-archetype (An archetype which contains a sample archetype.)
  3. 2: internal -> org.apache.maven.archetypes:maven-archetype-j2ee-simple (An archetype which contains a simplifed sample J2EE application.)
  4. 3: internal -> org.apache.maven.archetypes:maven-archetype-plugin (An archetype which contains a sample Maven plugin.)
  5. 4: internal -> org.apache.maven.archetypes:maven-archetype-plugin-site (An archetype which contains a sample Maven plugin site.
  6. This archetype can be layered upon an existing Maven plugin project.)
  7. 5: internal -> org.apache.maven.archetypes:maven-archetype-portlet (An archetype which contains a sample JSR-268 Portlet.)
  8. 6: internal -> org.apache.maven.archetypes:maven-archetype-profiles ()
  9. 7: internal -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
  10. 8: internal -> org.apache.maven.archetypes:maven-archetype-site (An archetype which contains a sample Maven site which demonstrates
  11. some of the supported document types like APT, XDoc, and FML and demonstrates how
  12. to i18n your site. This archetype can be layered upon an existing Maven project.)
  13. 9: internal -> org.apache.maven.archetypes:maven-archetype-site-simple (An archetype which contains a sample Maven site.)
  14. 10: internal -> org.apache.maven.archetypes:maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)

选择构建maven通用配置,groupId 是组织名,一般商业项目填写的是域名+公司名称+项目名称组合。artifactId填写项目名称。version项目版本,package 包名

  1. Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7: 7
  2. Define value for property 'groupId': com.baxiang
  3. Define value for property 'artifactId': mavenDemo_first
  4. Define value for property 'version' 1.0-SNAPSHOT: :
  5. Define value for property 'package' com.baxiang: :
  6. Confirm properties configuration:
  7. groupId: com.baxiang
  8. artifactId: mavenDemo_first
  9. version: 1.0-SNAPSHOT
  10. package: com.baxiang
  11. Y: : y
  12. [INFO] ----------------------------------------------------------------------------
  13. [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
  14. [INFO] ----------------------------------------------------------------------------
  15. [INFO] Parameter: basedir, Value: /Users/baxiang/Documents/Project/maven/demo_first
  16. [INFO] Parameter: package, Value: com.baxiang
  17. [INFO] Parameter: groupId, Value: com.baxiang
  18. [INFO] Parameter: artifactId, Value: mavenDemo_first
  19. [INFO] Parameter: packageName, Value: com.baxiang
  20. [INFO] Parameter: version, Value: 1.0-SNAPSHOT
  21. [INFO] project created from Old (1.x) Archetype in dir: /Users/baxiang/Documents/Project/maven/demo_first/mavenDemo_first
  22. [INFO] ------------------------------------------------------------------------
  23. [INFO] BUILD SUCCESS
  24. [INFO] ------------------------------------------------------------------------
  25. [INFO] Total time: 25:07 min
  26. [INFO] Finished at: 2018-09-01T16:36:57+08:00
  27. [INFO] -----------------------------------------------------------------------

构建出来的项目结构

  1. $ tree
  2. .
  3. └── mavenDemo_first
  4. ├── pom.xml
  5. └── src
  6. ├── main
  7. └── java
  8. └── com
  9. └── baxiang
  10. └── App.java
  11. └── test
  12. └── java
  13. └── com
  14. └── baxiang
  15. └── AppTest.java
  16. 10 directories, 3 files

IDEA构建JAVA APP

Java基础——Maven - 图2
使用jetty作为服务器,需要pom.xml文件增加插件内容

  1. <plugin>
  2. <groupId>org.eclipse.jetty</groupId>
  3. <artifactId>jetty-maven-plugin</artifactId>
  4. <version>9.4.12.v20180830</version>
  5. </plugin>

编译代码运行插件

  1. mvn jetty:run

使用Tomcat 部署

  1. <plugin>
  2. <groupId>org.apache.tomcat.maven</groupId>
  3. <artifactId>tomcat7-maven-plugin</artifactId>
  4. <version>2.2</version>
  5. <configuration>
  6. <path>/</path>
  7. </configuration>
  8. </plugin>

运行

  1. mvn clean install tomcat7:run

POM概述

POM是Project Object Model的缩写。项目的属性、依赖、构建配置这些信息都被抽象到项目对象模型里边

项目基本信息

  1. <groupId>com.baxiang</groupId>
  2. <artifactId>mavendemo</artifactId>
  3. <version>1.0-SNAPSHOT</version>
  4. <packaging>jar</packaging>

插件目标

  1. # mvb 插件名称:目标
  2. mvn archetype:generate

常用插件

(1)maven-archetype-plugins 快速生成一个项目的骨架
简单的maven工程骨架

  1. maven-archetype-quickstart
  2. maven-archetype-simple

简单的maven web工程骨架

  1. maven-archetype-webapp

使用archetype创建项目

  1. mvn archetype:generate

(2)maven-dependency-plugin 帮助分析项目依赖
(3)maveb-help-plugin 插件辅助工具
(4)maven-resources-plugin 提供详细的项目结构,独立管理Java代码文件和资源文件
(5)maven-surefire-plugin 执行单元测试
(6)jetty-maven-plugin 内置jetty容器,可以通过命令,将项目运行在jetty容器中
(7)maven-enforcer-plugin 允许创建一系列规则,然后强制遵守

Maven依赖管理

Maven的坐标可以唯一的确定一个依赖,Maven也是通过坐标来管理依赖关系,在POM中是通过dependency来定义

  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>3.8.1</version>
  6. <scope>test</scope>
  7. </dependency>
  8. </dependencies>

Maven的依赖范围:scope
  compile(编译范围—默认),表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去
  provided(已提供范围):只有在jdk或者一个容器提供依赖之后才会使用
  runtime(运行时范围):在运行和测试系统时需要,编译的时候不需要
  test(测试范围):在一般编译和运行的时候都不需要,只有在测试编译或者测试运行阶段才可使用,比如说jUnit
  system(系统范围):与provided类似,但是该范围必须显示的提供一个对于本地系统中jar文件的路径。

dependencyManagement

在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
2、pom.xml文件中,jar的版本判断的两种途径
1)如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version。
2)如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
3、1)dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
2)dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

  1. //只是对版本进行管理,不会实际引入jar
  2. <dependencyManagement>
  3. <dependencies>
  4. <dependency>
  5. <groupId>org.springframework</groupId>
  6. <artifactId>spring-core</artifactId>
  7. <version>3.2.7</version>
  8. </dependency>
  9. </dependencies>
  10. </dependencyManagement>
  11. //会实际下载jar包
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-core</artifactId>
  16. </dependency>
  17. </dependencies>

Maven仓库

创建web项目的时候,通常会在项目的根目录下创建一个lib的子目录,在lib目录下我们存放着第三方的依赖jar文件,比如说log4j、jUnit等。每创建一个项目,就需要重复引入一些三方jar文件到lib目录下,这个lib目录就相当于我们项目的一个依赖仓库。那么对于Maven来说,它的仓库也是一个位置,该位置放置了所有的jar文件,但是不同的是,所有的Maven项目都会从同一个Maven仓库中获取到自己所需要的依赖jar文件,这样的设计节省了磁盘资源,可以说Maven仓库就是一个存放了所有依赖的仓库,这个仓库通过依赖的坐标对所有的依赖进行了管理。

Maven的远程仓库

 我们在构建项目的时候,并没有手动的下载任何的jar文件,而项目却能成功的构建。这是因为我们在用Maven构建项目的时候如果在本地Maven仓库中找不到相应的依赖,那么Maven会自动的去查询远程仓库并且从远程仓库将相关依赖下载到本地仓库,Maven本身自带了一个远程仓库,该远程仓库是Maven的中央仓库,Maven中央仓库地址是http://mvnrepository.com/
Java基础——Maven - 图3

解决mav 项目构建慢的问题

修改中央仓库地址为国内镜像.。默认全局修改是maven/conf/settings.xml文件

  1. <mirrors>
  2. <!-- 阿里云仓库 -->
  3. <mirror>
  4. <id>alimaven</id>
  5. <name>aliyun maven</name>
  6. <url>https://maven.aliyun.com/repository/central/</url>
  7. <mirrorOf>central</mirrorOf>
  8. </mirror>
  9. <!-- 华为云-->
  10. <mirror>
  11. <id>huaweicloud</id>
  12. <mirrorOf>*</mirrorOf>
  13. <url>https://mirrors.huaweicloud.com/repository/maven/</url>
  14. </mirror>
  15. </mirrors>

maven配置指南

打开maven的配置文件(windows机器一般在maven安装目录的conf/settings.xml),在标签中添加mirror子节点:

  1. <mirror>
  2. <id>aliyunmaven</id>
  3. <mirrorOf>*</mirrorOf>
  4. <name>阿里云公共仓库</name>
  5. <url>https://maven.aliyun.com/repository/public</url>
  6. </mirror>

如果想使用其它代理仓库,可在节点中加入对应的仓库使用地址。以使用spring代理仓为例:

  1. <repository>
  2. <id>spring</id>
  3. <url>https://maven.aliyun.com/repository/spring</url>
  4. <releases>
  5. <enabled>true</enabled>
  6. </releases>
  7. <snapshots>
  8. <enabled>true</enabled>
  9. </snapshots>
  10. </repository>

gradle配置指南

在build.gradle文件中加入以下代码:

  1. allprojects {
  2. repositories {
  3. maven { url 'https://maven.aliyun.com/repository/public/' }
  4. mavenLocal()
  5. mavenCentral()
  6. }
  7. }

如果想使用maven.aliyun.com提供的其它代理仓,以使用spring仓为例,代码如下:

  1. allProjects {
  2. repositories {
  3. maven { url 'https://maven.aliyun.com/repository/public/' }
  4. maven { url 'https://maven.aliyun.com/repository/spring/'}
  5. mavenLocal()
  6. mavenCentral()
  7. }
  8. }

本地仓库地址在当前登录用户的底下 文件名称是.m2的目录下

  1. tree ~/.m2 -L 2
  2. /Users/baxiang/.m2
  3. └── repository
  4. ├── antlr
  5. ├── asm
  6. ├── com
  7. ├── commons-codec
  8. ├── commons-collections
  9. ├── commons-io
  10. ├── commons-lang
  11. ├── dom4j
  12. ├── jdom
  13. ├── net
  14. ├── org
  15. └── xml-apis
  16. 13 directories, 0 files

自定义Meven删除

  1. /Library/Caches/IntelliJIdea2019.2/Maven/Indices

模块打包

父模块打包

父模块打包时,子模块都是依赖即使打包的jar,所有模块的jar都是最新jar

子模块打包

子模块直接打包,如果有依赖其他模块,其他的模块必须在本地库存在, mvn install 方式安装到本地库,所以子模块打包都是使用库里的jar. 如果要使用最新的代码,方式一,父模块直接打包;方式二,把所有依赖的模块 install 到maven本地库中

参考

https://maven.aliyun.com/mvn/guide
https://help.aliyun.com/document_detail/102512.html