好记性不如烂笔头
- maven 简介和项目构建的命令介绍
- myecilpse 创建maven 项目
- 依赖管理
1. maven简介
Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache软件基金会主持的独立Apache项目。
maven将一整个项目看成是一个对象。管理的核心是 pom.xml 文件,pom 文件中定义 dependency ,配置管理相应的仓库。
1.1 使用maven优点
简化操作:通常使用 IDE 进行编程,编译、测试和部署等操作都是手动独立进行,有了 maven 可以通过 maven 自动进行,简化操作。
统一配置:不同机器 IDE 环境难以统一,本地代码测试通过,换台电脑就可能报错,使用 maven 能统一配置。
操作简单:具有明确的约定;定义一个 pom.xml ,按照规范进行操作即可;拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程 (与ant相比)
1.2 maven主要功能
Maven是跨平台的项目管理工具。基于Java平台提供以下服务
- 项目构建
- 依赖管理
- 项目信息管理
先介绍项目构建,依赖管理和项目信息管理需要结合maven项目说明,第二部分介绍创建maven项目,依赖管理和项目信息管理放到第三部分
1.2.1 项目构建
项目构建过程如上图所示,通过命令行执行:
a)打开cmd命令行,项目根目录(包含有pom.xml文件的目录)
b)执行 mvn compile命令
执行完毕后,生成了maven工程编译完成后字节码文件的生成目录target
c)cmd 中继续录入mvn clean命令
d)cmd 中录入 mvn clean test命令
执行完毕后,字节码生成目录中生成了被测试类与测试类的编译字节码和测试执行过程日志与详细报告
e)cmd 中录入 mvn clean compile命令
f)cmd 中录入 mvn clean test命令
组合指令,先执行clean,再执行test,通常应用于测试环节
g)cmd 中录入 mvn clean package命令
组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前
执行过程:
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
h)cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中
组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前
执行过程:
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
部署————将打好的包发布到资源仓库中
2. 用 myeclipse 创建一个 maven 项目
2. 1 配置 maven 的环境
1.下载 maven 项目包
下载 maven 项目包,并解压,注意路径中不要有中文,避免不必要的麻烦。
目录如下:
* bin:含有mvn运行的脚本
* boot:含有plexus-classworlds类加载器框架
* conf:含有settings.xml配置文件
* lib:含有Maven运行时所需要的java类库
* LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
2.检查jdk安装的情况,需要 jdk 1.6 或以上,我的是 jdk 1.7
3.配置maven的环境变量
MAVEN_HOME:
E:apache-maven-3.0.5-binapache-maven-3.0.5
Path:
%MAVEN_HOME%in
查看是否配置成功,输入
mvn -v
4.修改maven本地仓库位置
maven会下载相关的依赖到本地,有一个默认的下载路径在C盘,我们把它修改到自己的自定义位置。
打开 conf — setting.xml,配置用户范围的settings.xml
注意:仓库的位置必须有一个setting.xml,且和maven包中的完全相同
2.2 myeclipse中创建一个maven项目
2.2.1 配置 myeclipse 的 maven 插件
2.2.2 新建 maven 项目
右击 — 新建一个maven 项目
Maven坐标:
1. groupId:定义当前Maven项目隶属项目
2. artifactId:定义实际项目中的一个模块
3. version:定义当前项目的当前版本
MAVEN是一个巨大的仓库,有了坐标我们才能准确定位项目,并将构建交由maven处理。
创建完成后,项目目录如下:
2.2.3 重点看一下 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.0</modelVersion>
<!-- 组织名称 -->
<groupId>com.shuiyujie</groupId>
<!-- 项目名称 -->
<artifactId>A</artifactId>
<!-- 版本号 -->
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>A</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
其中如下代码添加 Junit 的依赖:
<!-- 依赖设置 -->
<dependency>
<!-- 依赖组织名称 -->
<groupId>junit</groupId>
<!-- 依赖项目名称 -->
<artifactId>junit</artifactId>
<!-- 依赖版本名称 -->
<version>4.9</version>
<!-- 依赖范围:test包下依赖该设置 -->
<scope>test</scope>
</dependency>
依赖都通过这种方式进行添加,譬如要添加 log4j:
1. http://www.mvnrepository.com 进入网站查找 log4j 依赖的配置怎么写
2. 将其复制过来粘贴即可
(要用什么查找)
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.2.4 运行 maven 项目进行测试
public class A {
public String say(String str){
return "A:I am " + str;
}
}
public class TestA {
@Test
public void test(){
A a = new A();
String str = a.say("Mike");
Assert.assertEquals("A: I am Mike",str);
}
}
3. 依赖管理
第二部分已经创建了一个maven项目,并且对其进行了测试。我们可以通过1.2.1 项目构建 中的相关命令对 maven 项目进行构建。maven 提供的另一个服务是依赖管理,接下来介绍依赖管理。
项目A中使用了 Junit 和 Log4j,相当于A 依赖 Junit 和 Log4j,对这些依赖进行管理则成为依赖管理。
首先来考虑一下,创建一个项目 B,而项目 B 依赖于项目 A,应该如何实现呢?
- 同第二步创建一个maven项目,名称为B
- 在B中使用A
public class B {
public String say(String Str){
//调用One
A a = new A();
String ret = a.say(Str);
return ret + " --B";
}
}
3.pom.xml中需要添加A的依赖
<dependency>
<groupId>com.shuiyujie</groupId>
<artifactId>A</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
4.注意点,如果想用maven构建B,而B依赖A,则需要将项目A打包放到仓库,即在项目A中执行
clean install
不进行以上操作,会报如下错误
5.编译项目B
clean compile
这时如果载创建一个项目C,C依赖于B会怎么样?
如图所示,B依赖于A,C依赖于B。则C与B,B与A称为直接依赖,C与A成为间接依赖。依赖具有传递性,也就是说C中也会有A项目存在。
B如果不想让C知道B依赖了C怎么办?
项目B依赖了C,但是不想让其他项目,比如项目C看到A的源码。比如原因是项目A是机密项目。那该如何进行配置?
依赖可以分成:传递性依赖和可选依赖,排除依赖,可以通过 pom.xml 进行控制。
主动不传递
<optional> true/false
表示是否向下传递,当C用B时,如果设置为true则不传递。
<dependency>
<groupId>com.shuiyujie</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 可选依赖控制当前依赖是否向下传递成为间接依赖 -->
<!-- <optional>true</optional> -->
</dependency>
自作多情传递了别人还不要
B将A传递给了C,但是C不要咋办?
<dependency>
<groupId>com.shuiyujie</groupId>
<artifactId>C</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
<!-- 设置排除 -->
<!-- 排除依赖必须基于直接依赖中的间接依赖设置为可以依赖为false -->
<!-- 设置当前依赖中是否使用间接依赖 -->
<!--
<exclusions>
具体排除
<exclusion>
<groupId>com.shuiyujie/groupId>
<artifactId>A</artifactId>
</exclusion>
</exclusions>
-->
</dependency>