Maven 初步

Maven 进行Java项目构建

Maven是什么

1. Maven是基于项目对象模型(POM project object model),可以通过一小段描述(配置)信息来管理项目的构建,报告和文档的软件项目管理工具。

1
2
3
4
5
6
7
8
9
https://www.cnblogs.com/whgk/p/7112560.html
为什么要使用maven
假如你正在Eclipse下开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?
需要用哪个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包即可。所以这里也如此,可以将B项目打成jar包,然后在A项目的Library下导入B的jar文件,这样,A项目就可以调用B项目中的某些类了。
这样做有缺陷:
如果在开发过程中,发现B中的bug,则必须将B项目修改好,并重新将B打包并对A项目进行重编译操作;
在完成A项目的开发后,为了保证A的正常运行,就需要依赖B。发布的时候要么
(1)将B打包进A;
(2)要么将B也发布,源码安装,这是我们经常使用的。

2. 区别于上述依赖模式,maven的核心功能是合理叙述项目间的依赖关系。也就是通过pom.xml文件的配置获取jar包,而不是手动去添加jar包。

3. 学习maven的最终目的就是学会如何在pom.xml文件中配置获取到我们想要的jar包。

例子:
如何用pom.xml文件获取junit的jar包:

1
pom可以通过groupId,artifactId和version三个属性来定位一个jar包。加入pom.xml的文件属于A项目,那么A项目一定是一个maven项目。需要找到的junit项目的jar包也必须是一个maven项目,在创建每个maven项目的时候都会要求写上这三个属性值。

1

Maven的安装

参考Hadoop安装, 将apache-maven3.6.1压缩包解压到/usr/local/
按实际配置环境变量。

注意环境变量中添加的是$MAVEN_HOME/bin

命令行 mvn -v查看是否安装成功。

仓库的概念

通过pom.xml文件就能够找到依赖包jar。那么这些jar包在哪里呢。在仓库里
仓库分为:本地仓库,第三方仓库和中央仓库

  1. 本地仓库:一般我们会建立一个文件夹,在网上下载一个拥有相对完整的所有jar包的组合,然后放到本地仓库,之后总该本地仓库调取就可以了。

    修改本地仓库的路径:/usr/local/apache-maven/conf/settings.xml中的

  2. 第三方仓库:又称为内部中心仓库,也称为私服。一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(使用私服为了减少对中央仓库的访问)

  3. 中央仓库:Maven内置了远程公用仓库:http://repo1.maven.org/maven2。这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主。工程依赖的jar包如果本地仓库没有,默认从中央仓库下载

##3 使用命令行创建maven项目

创建一个空白文件路径,运行如下命令:

1
mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

注意
版本命令冲突,即在maven3.0.5以上版本舍弃了create,使用generate生成项目
用上述命令会产生如下报错信息:
Could not find goal ‘create’ in plugin org.apache.maven.plugins:maven-archetype-plugin:3.0.0 among available goals crawl, create-from-project, generate, help, integration-test, jar, update-local-catalog -> [Help 1]
修改
将上述命令中create更改为generate就可以。

  • mvn:核心命令
  • archetype:create:创建项目,现在maven高一点的版本都弃用了create命令而使用generate命令了。
  • -DgroupId=com.wuhao.maven.quickstart :创建该maven项目时的groupId是什么,该作用在上面已经解释了。一般使用包名的写法。因为包名是用公司的域名的反写,独一无二
  • -DartifactId=simple:创建该maven项目时的artifactId是什么,就是项目名称
  • -DarchetypeArtifactId=maven-archetype-quickstart:表示创建的是[maven]java项目
  • 运行的前提:需要联网,必须上网下载一个小文件

运行成功会在命令行中显示Build Success
在该路径下会出现simple路径,这就是我们新建立的java项目。

maven项目的结构

1
2
3
4
5
6
7
8
9
10
simple
---pom.xml 核心配置,在项目根目录下
---src
---main
---java java源代码目录
---resources java配置文件目录
---test
---java java测试代码目录
---resources 测试配置文件目录
---target 输出目录,对该项目进行编译,生成.class文件放置在该输出目录下

maven编译

复习一下Java的编译

  • 在Linux下配置Java的编译,首先要确保jdk安装环境变量。
  • jdk为java开发工具包,包含jre环境和javac编译器。
  • jre为java运行时的环境,包括java虚拟机环境,java基础类库等。javac是java源码的编译器。
  • classpath表示当我们需要一个java的库(class)时,系统会自动在CLASSPATH里面搜索,如果是jar,就自动从jar里面查找,如果是普通的目录,则在目录下面按照package进行查找。
  • 也就是说,在用命令行编译一个java源码的时候,你需要将import导入的库包含在CLASSPATH中。否则将会报[ERROR]。
1
2
3
4
5
# java environment
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

例如,编译hadoop-book/ch3/URLCat.java的程序。需要找到 package org.apache.hadoop.fs。但这个在哪里找呢?反正我是没有在hadoop的安装文件里找到相关的package。所以只好尝试maven编译。

javac_error

maven编译java文件 (hadoop-book/ch3/URLCat.java编译)

  1. 命令行构造maven项目
  2. 在/main/src/java下添加URLCat.java源码
  3. 修改根目录 pom.xml,添加库
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.9.2</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.9.2</version>
    </dependency>
  4. 保持网络连接,命令行mvn clean compile进行编译。

maven_compile
5. 参考Hadoop相关命令进行后续操作。Hadoop-HDFS操作

使用MyEclipse创建maven项目

高版本的MyEclipse中一般都内置了maven。MyEclipse2017 中内置了maven 3.3。
TBC在MyEclipse配置自己安装的maven。

创建maven java项目

  1. 在Eclipse中创建maven project。注意,要勾选maven project。有可能没有出现在tool bar中,通过other获得。

3
2. 勾选创建简单项目, create a simple project

4
3. 设置项目参数,创建java项目

5