#Maven Maven官网
Maven下载 Maven安装与配置 #Maven安装 ##Windows安装 ###配置Java
- 下载JRE或者JDK
- 配置JAVA_HOME环境变量到JRE或者JDK的根目录 ###下载并解压Maven
- Maven官网下载压缩包,解压缩
- 配置M2_HOME环境变量 ##Ubuntu安装
sudo apt-get install maven
##CentOS安装
yum install maven
##Mac OS X安装
brew insall maven3
##二进制安装 #Maven实战 ##Maven核心概念
##人肉式
- 手动编译
- 手动打war包
- 手动复制war包运行
##IDE ###eclipse
- 下载依赖包:去哪里下载
- 编写源代码、配置文件 目录结构怎么定
- 编译、测试、打包、发行 构建流程不统一
- 项目代码共享以及依赖
- 各种依赖的版本管理
- 远程部署问题 ##Maven是什么
- Apache基金会出品
- 开源
- Java编写 通常把Maven理解成项目构建和依赖管理工具
##为什么是Maven
- 约定(惯例)优先原则
- 三方依赖管理 - 提供远程仓库,解决了依赖维护
- 提供一致的项目构建管理方式 - 减少构建工作量
- 插件式架构,大量的可重用插件
- 方便集成IDE
- 开源项目使用Maven
##Maven安装
- 依赖JDK,保证Java已经安装
- Maven官网
- 配置环境变量
-
- M2_HOME=/path/to/maven/root
-
- PATH=$PATH:$M2_HOME/bin
- 国内镜像 由于OSC镜像库停止服务,从Maven课程说明得知,可以使用Aliyun镜像库
##pom.xml
- groupId 组织
- artifactId 项目
- version 版本
上面三个称为Maven项目的唯一标示
- packaging 打包类型
- dependencies 依赖项目
<?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">
<modelVersion>4.0.0</modelVersion>
<!-- groupId 组织,使用java包式描述 -->
<groupId>groupId</groupId>
<!-- artifactId 项目标识符(不要使用标点) -->
<artifactId>TomcatStudy</artifactId>
<!-- 版本号SNAPSHOT会替换时间戳快照,发布 -->
<version>1.0-SNAPSHOT</version>
<!-- 打包类型war或者jar -->
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 存在编译需要而发布不需要的jar包,可以用scope标签,值设为provided -->
<scope>provided</scope>
</dependency>
</dependencies>
</project>
##Maven基本命令
- mvn archetype:generate - 使用模板生成项目
- mvn compile 编译源代码
- mvn test 跑单元测试
- mvn package 打包应用
- mvn deploy 部署
- mvn site生成项目相关的文档站点
- mvn clean 清理
- mvn install 把包安装到本地仓库
##Maven Tomcat插件
- Tomcat官方提供的一个Maven插件,用于方便应用和tomcat的开发运行调试
- 详细帮助
-
- mvn help:describe -Dplugin=tomcat7
- 常见命令
-
- mvn tomcat7:run 启动一个嵌入式的tomcat实例(在maven中)
-
- mvn tomcat:deploy
- *mvn tomcat:undeploy
#Maven Tomcat实践演示 确定maven工作正常
mvn
##Maven生成webapp项目 通过模板创建应用。在确定的项目目录内执行一下命令,创建规范的项目目录树:
命令如下:
mvn archetype:generate -DgroupId=com.netease.restaurant -DartifactId=Restaurant -Dpackage=com.netease -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp
打印如下,程序需要向我们进行确认:
zhanpeng@GE70:~/Workspace/maven/restaurant$ mvn archetype:generate -DgroupId=com.netease.restaurant -DartifactId=Restaurant -Dpackage=com.netease -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Using property: groupId = com.netease.restaurant
[INFO] Using property: artifactId = Restaurant
[INFO] Using property: version = 1.0.0-SNAPSHOT
[INFO] Using property: package = com.netease
Confirm properties configuration:
groupId: com.netease.restaurant
artifactId: Restaurant
version: 1.0.0-SNAPSHOT
package: com.netease
Y: :
输入y
进行确认,确认之后我们查看目录结构。
我们可以看到如下目录树:
zhanpeng@GE70:~/Workspace/maven/restaurant$ tree
.
└── Restaurant
├── pom.xml
└── src
└── main
├── resources
└── webapp
├── index.jsp
└── WEB-INF
└── web.xml
6 directories, 3 files
补充建立目录并把之前项目的文件放置到正确位置:
zhanpeng@GE70:~/Workspace/maven/restaurant$ tree
.
└── Restaurant
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── netease
│ │ ├── HelloServlet.java
│ │ └── NoodlesServlet.java
│ ├── resources
│ └── webapp
│ ├── index.jsp
│ ├── SoybeanMilk.html
│ └── WEB-INF
│ ├── web.xml
└── test
└── java
11 directories, 6 files
源代码参考之前代码 ##Maven添加依赖 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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.netease.restaurant</groupId>
<artifactId>Restaurant</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>Restaurant Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<finalName>Restaurant</finalName>
</build>
</project>
##Maven添加插件
<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">
...
<dependencies>
...
</dependencies>
<build>
<finalName>Restaurant</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>UTF-8</uriEncoding>
<finalName>Restaurant</finalName>
<server>tomcat</server>
</configuration>
</plugin>
</plugins>
</build>
</project>
##maven-tomcat-plugin运行
mvn tomcat7:run
**注意:**课程给的例子是发生错误,由于serlvet包并没有添加<scope>provided</scope>
,注意如下内容的修改:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
运行测试
zhanpeng@GE70:~$ curl http://localhost:8080/Restaurant/noodles
<html><body>
<h1> Noodles with Tomato</h1>
</html></body>
#Maven管理多模块Web项目实战 之前的配置是单个项目,但是在后面的项目内容,更多的是分模块进行项目内容开发。这就涉及到多模块管理与依赖关系描述。多个项目相互依赖非常复杂,maven帮助我们管理多模块内容。 ##创建子模块
mvn archetype:generate -DgroupId=com.netease.restaurant -DartifactId=Kitchen -Dpackage=com.netease -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart
我们可以看到目录树变更为:
zhanpeng@GE70:~/Workspace/maven/restaurant$ tree
.
├── Kitchen
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── netease
│ │ └── App.java
│ └── test
│ └── java
│ └── com
│ └── netease
│ └── AppTest.java
└── Restaurant
├── pom.xml
├── Restaurant.iml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── netease
│ │ │ ├── HelloServlet.java
│ │ │ └── NoodlesServlet.java
│ │ ├── resources
│ │ └── webapp
│ │ ├── index.jsp
│ │ ├── SoybeanMilk.html
│ │ └── WEB-INF
│ │ ├── web.xml
│ │ └── web.xml~
│ └── test
│ └── java
修改子模块代码
##管理两个子项目的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.netease.restaurant</groupId>
<artifactId>restarant-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging> <!-- 管理子项目 -->
<name>Multi modules demo</name>
<modules>
<module>Restaurant</module>
<module>Kitchen</module>
</modules>
</project>
备注:正确添加pom.xml文件之后,就可以使用idea打开多模块项目 ##修改子模块的pom.xml配置 Kitchen项目的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.netease.restaurant</groupId>
<artifactId>Kitchen</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>Kitchen</name>
<url>http://maven.apache.org</url>
<!-- 添加总管理依赖 -->
<parent>
<groupId>com.netease.restaurant</groupId>
<artifactId>restarant-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Restaurant项目的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.netease.restaurant</groupId>
<artifactId>Restaurant</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>Restaurant Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 添加总管理依赖 -->
<parent>
<groupId>com.netease.restaurant</groupId>
<artifactId>restarant-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<!-- 依赖Kitchen -->
<dependency>
<groupId>com.netease.restaurant</groupId>
<artifactId>Kitchen</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>Restaurant</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>UTF-8</uriEncoding>
<finalName>Restaurant</finalName>
<server>tomcat</server>
</configuration>
</plugin>
</plugins>
</build>
</project>
注意:idea开启自动导入包,不然子项目包无法载入
##把包安装到本地仓库
mvn install
到web子项目启动运行:
mvn tomcat7:run
访问测试:
zhanpeng@GE70:~$ curl http://localhost:8080/Restaurant/hello
hello world
Hello Kitchen
确定子项目被加载进来 #eclipse方式使用maven ##eclipse安装maven插件 工具栏:help->Install New Software
eclipse neon无法安装插件 ##eclipse导入项目 选择项目
确认导入项目信息
项目导入成功
##eclipse使用maven进行运行 需要执行的Web项目上右键->Run As->Run Configurations
双击Maven Build创建运行内容
注意:Base Directory填写${workspace_loc:/Restaurant}
,Goals填写tomcat7:run
点击运行,并确认运行结果
zhanpeng@GE70:~$ curl http://localhost:8080/Restaurant/hello
hello world
Hello Kitchen
#Maven FAQ Q: 我执行tomcat7插件相关的操作时,怎么一直报错,提示找不到tomcat7插件?
A: 这个是因为tomcat7插件的groupId不在maven默认的pluginGroups中,解决方法有一下几种:
- 在一个配置了tomcat7插件的项目目录下执行,因为配置了tomcat7插件,所有maven就知道了其groupId,所以就能够找到了
- 使用带groupId的全限定名,例子如下: mvn help:describe -Dplugin=org.apache.tomcat.maven:tomcat7-maven-plugin:2.2 由于在指定plugin的时候,写了完整的groupId,所以这样也是可以的
- 修改一下mvn的配置文件settings.xml, 在<pluginGroups> 这个配置项下面,增加一个<pluginGroup>配置即可 <pluginGroups> <pluginGroup>org.apache.tomcat.maven</pluginGroup> </pluginGroups>
想了解更多为什么会这样,请参考 http://maven.apache.org/guides/introduction/introduction-to-plugin-prefix-mapping.html
Q: 我在实战maven管理多项目的时候,执行mvn tomcat7:run 报了错误,错误信息是“The POM for com.netease.restaurant:Kitchen:jar:1.0.0-SNAPSHOT is missing, no dependency information available”,怎么办?
A: 在多项目管理实战中的这个例子中,Restaurant对Kitchen有依赖,如果你直接在Restaurant这个项目中执行 mvn tomcat7:run的话,由于此时Kitchen还没有放到本地仓库中,因此Restaurant找不到这个Kitchen的依赖,所以报错了。解决方案如下:
1.可以在Kitchen这个项目中执行 mvn install,此时会把这个Kitchen项目安装maven的本地仓库,然后再在Restaurant项目中引用,就能找到了
2.直接在顶层的 restaurant-parent 这个项目下先执行 mvn install,这样的话,顶层的这个父项目会把所有的子项目都安装到本地仓库,并维护好依赖关系