Maven 是干什么用的?即使不使用 Maven 我们仍然可以进行 B/S 结构项目的开发。从表述层、业务逻辑层到持久化层 再到数据库都有成熟的解决方案。
①一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。
借助于Maven就可以将一个项目拆分成多个工程。
②项目中需要的jar包必须手动”复制”、"粘贴” 到WEB-INF/lib目录下
带来的问题是:同样的jar包文件重复出现在不同的项目工程中, 一方面浪费存储空间,另外也让工程比较臃肿。
借助Maven,可以将jar包仅仅保存在“仓库”中,有需要使用的工程”引用”这个文件接口,并不需要真的把jar包复制过来。
③jar包需要别人替我们准备好,或到官网下载
不同技术的官网提供jar包下载的形式是五花八门的。
有些技术的官网就是通过Maven或SVN等专门的工具来提供下载的。
如果是以不规范的方式下载的jar包,那么其中的内容很可能也是不规范的。
借助于Maven可以以一种规范的方式下载jar包。因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在了Maven的中央仓库中。
以规范的方式下载的jar包,内容也是可靠的。
Tips: "统一的规范"不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的。
④一个jar包依赖的其他jar包需要自己手动加入到项目中
例如,上传功能中,FileUpload组件 → IO组件。 commons-fileupload-1.3jar依赖于commons-io-2.0.1.jar
如果所有jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本。
Maven会自动将被依赖的jar包导入进来。
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java
开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta
项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。
构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从 以下三个层面来看:
①纯 Java 代码 大家都知道,我们 Java 是一门编译型语言,.java 扩展名的源文件需要编译成.class 扩展名的字节码 文件才能够执行。所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。
②Web 工程 当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务 器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。 我们可以将未编译的 Web 工程比喻为一只生的鸡,编译好的 Web 工程是一只煮熟的鸡,编译部署 的过程就是将鸡炖熟。 Web 工程和其编译结果的目录结构对比见下图:
③实际项目 在实际项目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 页面、图片等静态资源之外,还 包括第三方框架的 jar 包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服 务器上,项目才可以运行。 所以综上所述:构建就是以我们编写的 Java 代码、框架配置文件、国际化等其他资源文件、JSP 页 面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。 那么项目构建的全过程中都包含哪些环节呢?
既然构建的过程这么的繁琐,这时候就需要用到我们的maven工具了。
JAVA_HOME
环境变量① 配置MAVEN_HOME
或者是M2_HOME
② 配置path
在此之前呢,我们有必要知道maven中的核心概念,分别为
①约定的目录结构(重要)
②POM(重要)
③坐标(重要)
④依赖(非常重要)
⑤仓库
⑥生命周期/插件/目标
⑦继承
⑧聚合
接下来我们会在不断的实践中介绍这几个核心概念。
约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须 能找到 Java 源文件,下一步才能编译,而编译之后也必须有一个准确的位置保持编译得到的字节码文件。
我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
按照上面对目录结构的约定,我们建立第一个maven程序。
我们在HelloMaven下新建一个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.0modelVersion>
<groupId>com.veeja.mavengroupId>
<artifactId>HelloMavenartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>HelloMavenname>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.0version>
<scope>testscope>
dependency>
dependencies>
project>
编写主程序代码
在src/main/java/com/veeja/maven目录下新建文件HelloMaven.java,内容如下:
package com.veeja.maven;
public class HelloMaven {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
编写测试代码
在/src/test/java/com/veeja/maven目录下新建测试文件HelloTest.java
package com.veeja.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
HelloMaven helloMaven = new HelloMaven();
String results = helloMaven.sayHello("veeja");
assertEquals("Hello veeja!",results);
}
这里要额外补充一点知识:
①Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
②当我们执行的Maven命令需要用到某些插件时, Maven核心程序会首先到本地仓库中查找。
③本地仓库的默认位置: [系统中当前用户的家目录]\.m2\repository
④Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
⑤如果此时无法连接外网,则构建失败。
⑥修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
找到Maven解压目录\conf\settings.xml
,找到localRepository标签,
把它从注释里取出来,将标签体内容修改为已经准备好了的maven仓库目录中,
例如:
<localRepository>E:\Program Files\apache-maven-3.2.2\RepMavenlocalRepository>
接下来我们针对上面创建的HelloMaven程序,我们运行几个基本的maven命令:
注意,执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。
首先是mvn compile
:编译主程序。
这个命令会创建一个target文件夹,在里面生成一个classes文件夹,以及相应的class文件。
还有mvn test-compile
,编译测试程序。
这个命令也会在target文件夹里面生成一个test-classes文件夹,生成对应的class文件。
还有mvn package
:打包。
这个会生成一系列的东西在我们的文件夹下。
最后是mvn clean
:清理,会把我们构建产生的一系列文件,删除掉。
END.