理解并使用Maven,Jcenter管理你的应用

初识maven

Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从一个中心信息管理项目的构建、报告和文档。

初学者可以将maven理解为git和svn ,但是它不仅仅如此,还包括含了其他功能

可以说Maven是Android开发者经常要使用的一个东西,gradle中所有的依赖都是放在中心仓库中的,同类写也有Jcenter,它是一个仓库的超集,其中包括了maven center

jcenter 和 mavenCentral的区别

  • jcenter 是一个 mavenCentral 的超集,基本上它有的mavenCenter都有
  • jcenter 具有更好的 cdn,默认支持 https,这个对于谷歌有巨大吸引力
  • bintray(jcenter 的服务提供商)表示 jcenter 具有更好的性能
  • 有数据表明 bintray jcenter 占用更少的本地缓存空间
  • 更好的交互界面,可以从 jcenter 向 mavenCentral 同步包(下面两个平台的使用教程将会证实这一点)

Maven的安装

首先官方下载

我这里下载的是zip,下载后直接解压,然后设置加到环境变量PATH中,

1
export PATH=/Users/toto/software/apache-maven-3.6.0/bin:$PATH

我用的是mac本,并且bash用的是zsh,因此设置完别忘了更新配置

undefined 那么之后我们执行 undefined 会看到 ![](https://raw.githubusercontent.com/THtianhao/Picture/master/20190108212811_maven1.jpg) 那么maven就安装成功了。 要想了解Jcenter必须先了解maven,那么我们首先了解一下maven的是如何工作的 ## Mave构建 首先我们新建一个文件夹,然后来真实的创建一个maven仓库吧 undefined 我们执行了maven的`archetype:generate`并将各种参数传递过去,`archetype`后面跟的是插件,不同的插件作用不同,`generate`创建了一个简单的原型项目

首次运行进过一系列的下载,然后才会构建出新的仓库最后iterm给出的日志如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.mycompany.app
[INFO] Parameter: artifactId, Value: my-app
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.mycompany.app
[INFO] Parameter: packageInPathFormat, Value: com/mycompany/app
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.mycompany.app
[INFO] Parameter: groupId, Value: com.mycompany.app
[INFO] Parameter: artifactId, Value: my-app
[INFO] Project created from Archetype in dir: /Users/toto/Project/mavenRepostory/my-app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:13 min
[INFO] Finished at: 2019-01-08T21:23:14+08:00
[INFO] ------------------------------------------------------------------------

由于我们最初创建maven仓库时候填写的信息-DartifactId=my-app因此在此目录下生成了一个my-app的文件夹

1
cd my-app

image-20190108214223998

可以看出来-DgroupId=com.mycompany.app创建仓库的时候生成的包名也就是我们的目录了

pom.xml就是大家见过的POM(Project Object Model)项目对象模型

我们打开pom

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
<?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>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>

<name>my-app</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

pom承载着maven仓库的配置

build 项目

1
mvn package

和之前一样,没有构件过会下载一系列的配置,最终iterm输出

1
2
3
4
5
6
7
[INFO] Building jar: /Users/toto/Project/mavenRepostory/my-app/target/my-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:00 min
[INFO] Finished at: 2019-01-08T21:51:27+08:00
[INFO] ------------------------------------------------------------------------

和第一个命令不同,package是一个阶段,阶段是构件声明周期的一部分,它是一个有序列的阶段

那么生成后的目录为

image-20190108220231554

maven的阶段有:

  • validate: 验证项目是否正确并且所有必要信息都可用
  • compile: 编译项目的源代码
  • test: 使用合适的单元测试框架测试编译的源代码。这些测试不应要求打包或部署代码
  • package: 获取已编译的代码并将其打包为可分发的格式,例如JAR。
  • integration-test :如有必要,将程序包处理并部署到可以运行集成测试的环境中
  • verify: 运行任何检查以验证包是否有效并符合质量标准
  • install: 将软件包安装到本地存储库中,以便在本地用作其他项目的依赖项
  • deploy: 在集成或发布环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享。

还有另外两个生命周期 :

  • clean:清除先前构建创建的工件
  • site:为该项目生成站点文档

参考

Mave官网

安卓Library部署到Maven

Android Studio将项目发布到Maven仓库

谢谢您的鼓励~