Maven入门使用

Maven简单教程

  学习Hadoop与Spark过程中需要用Maven建立项目,学了一点,这里记录一下。

Maven项目典型目录结构

  • src——————————————————————–源代码
    • main
      • java
        • package
    • test—————————————————-放置测试用例
      • java
        • package
    • resources
  • pom.xml ———————————————用于管理项目依赖和构建过程

Maven简单命令

  • mvn -v 查看maven的版本
  • mvn -compile 编译项目
  • mvn -test 测试
  • mvn -package 打包
  • mvn -client 删除target 目录
  • mvn -install 按照jar包到本地仓库

    创建目录的方式(使用archetype自动创建)

  1. archetype : generate 按照提示进行选择
  2. archetype : generate
    -DgroupId=组织名、公司域名的反写+项目名
    -DartfactId=项目名-模块名
    -Dversion=版本号
    -Dpackage=代码所存在的包名

  很多插件目标的参数都支持从命令行配置,用户可以在Maven命令中直接使用-D参数,并伴随一个参数键=参数值的形式来配置插件目标参数

Maven坐标概念

  为了快速定位一个项目,Maven定义了这样一组规则:世界上任何一个构件都可以使用Maven坐标唯一标识,Maven的坐标元素包括groupId、artifactId、version、packaging、classifier

  1. groupId
    : 定义当前Maven项目隶属的实际项目

  2. artifactId
    : 该元素定义实际项目中的一个模块,推荐的做法是使用实际项目名称作为artifactId的前缀。例如nexus-indexer-2.0.0

  3. version
    : 该元素定义Maven项目当前所处的版本

  4. packaging
    : 该元素定义了Maven项目的打包方式。打包方式通常与所生成构建的文件名的扩展名对应。packaging未定义的时候的默认值是jar

  5. classifier
    : 该元素用来帮助定义构建输出的一些附属构构件。附属构件与主构件对应。注意,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的构件帮助生成。

上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认是jar),classifier是不能直接定义的

Maven生命周期

三套生命周期

  Maven拥有三套相互独立的生命周期他们分别是clean、default和site。clean是生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期是建立项目站点
  以clean生命周期为例,它包含的阶段有pre-clean、clean和post-clean。当用户调用pre-clean的时候只有pre-clean阶段执行,当用户调用clean的时候,pre-clean和clean会得以按照顺序执行,当用户调用post-clean的时候,pre-clean,clean,post-clean会按照顺序执行
  较之与生命周期阶段前后的依赖关系,三套生命周期(clean,default,site)本身相互独立,用户可以仅仅调用clean生命周期的某个阶段而不会对其他生命周期有任何影响

claen生命周期

  clean是生命周期的目的是为了清理项目,它包含了三个阶段

  1. pre-clean 执行一些清理前需要完成的工作
  2. clean 清理上一次构建生成的文件
  3. post-clean 执行一些清理后需要完成的工作

default生命周期

  default生命周期定义了真正构建时所需要执行的所有步骤,他是所有生命周期中最核心的部分,其包括的阶段如下。

  • validate
  • initialize
  • generate-sources
  • process-source 处理项目主源文件。一般来说是对src/main/resources目录内容进行变量替换等工作,赋值到项目输出的主classpath目录中
  • generate-source
  • process-resource
  • compile 编译项目的主源码。一般来说,是编译src/main/java目录下的JAVA文件到项目输出的主classpath目录中
  • process-classes
  • generate-test-sources
  • process-test-sources 处理项目测试资源文件
  • generate-test-resource
  • test-compile 编译项目的测试代码
  • process-test-classes
  • test 使用单元测试框架运行测试,测试代码不会被打包或者部署
  • prepare-package
  • package 接受编译好的代码,打包成可以发布的格式如 JAR
  • pre-integration-test
  • integration-test
  • verify
  • install 将包安装到Maven的本地仓库,供本地其他Maven项目使用
  • deploy将最终的包复制到远程仓库,供其他开发人员和Maven项目使用

site生命周期

  site生命周期的目的是建立和发布项目的站点,maven能够给予pom所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息

  • pre-site 执行一些在生成项目站点前需要完成的工作
  • site 生成项目站点文档
  • post-site 执行一些在生成项目站点之后需要完成的工作
  • site-deploy 将生成的项目站点发布到服务器上

命令行与生命周期

  从命令行执行Maven任务的最主要方式就是调用Maven的生命周期阶段。需要注意的是各各生命周期之间相互独立,而同一个生命周期内具有前后依赖的关系
$mvn claen:该命令调用clean生命周期的clean阶段。实际执行阶段为clean生命周期的pre-clean和clean阶段
$mvn test:该命令执行的是default生命周期的test阶段。实际执行阶段为default生命周期的validate一直到test的所有阶段。这也解释了为什么执行测试的时候项目代码能够自动编译
$mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段。实际执行为依次执行各各生周期开头到clean和install阶段的中间所有阶段。该命令结合了两个生命周期。在执行真正项目构建之前清理项目是一个很好的实践。
$mvn clean deploy site-deploy:该命令调用clean生命周期的clean阶段,default生命周期中的deploy阶段以及site生命周期的site-deploy阶段。实际执行规律同上。

pom.xml文件例子

  下面是一个添加sparkstreaming依赖的项目例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<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.imooc.spark</groupId>
<artifactId>sparktrain</artifactId>
<version>1.0</version>
<inceptionYear>2008</inceptionYear>
<!--在这里统一设定依赖的版本号,便于统一管理-->
<properties>
<scala.version>2.11.8</scala.version>
<kafka.version>0.9.0.0</kafka.version>
<spark.version>2.2.0</spark.version>
<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
<hbase.version>1.2.0-cdh5.7.0</hbase.version>
</properties>

<repositories>
<!--添加cloudera仓库链接-->
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>

<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>

</repositories>

<pluginRepositories>
<pluginRepository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</pluginRepository>
</pluginRepositories>

<!--各种依赖-->
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
//这里使用引用的方式语法格式是${xxx.version}
<version>${scala.version}</version>
</dependency>
<!--kafka 依赖-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>${kafka.version}</version>
</dependency>
<!--hadoop-client依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--hbase-client依赖-->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
<!--hbase-server 依赖-->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
<!--sparkStreaming 依赖 这里的2.11是指的编译的scale的版本 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<!--Spark Streaming整合Flume 依赖-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-flume_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<!--spark SQL-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<!--jar 包冲突-->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.11</artifactId>
<version>2.6.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/net.jpountz.lz4/lz4 -->
<dependency>
<groupId>net.jpountz.lz4</groupId>
<artifactId>lz4</artifactId>
<version>1.3.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
</dependencies>

<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>

<!--添加各种插件-->
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
<args>
<arg>-target:jvm-1.5</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
</plugins>
</reporting>
</project>

-------------End Of This ArticleThank You For Reading-------------