共计 5749 个字符,预计需要花费 15 分钟才能阅读完成。
以前开发的时候,如果 A 我的项目须要某个 jar 包,可能去网上搜寻下载 jar 包,而后复制粘贴在开发对应的地位,如果 B 我的项目也须要这个 jar 包,那么同样须要再次手动复制粘贴到对应的地位。
为了解决这个问题,包治理应运而生,其中最通用以 maven 和 gradle 为主,前者次要侧重于 java 我的项目,后者侧重于 android 我的项目。留神,说的是侧重于,而不是就是。
什么是 maven 呢,让咱们来看下官网定义
At first glance Maven can appear to be many things, but in a nutshell Maven is an attempt to apply patterns to a project’s build infrastructure in order to promote comprehension and productivity by providing a clear path in the use of best practices. Maven is essentially a project management and comprehension tool and as such provides a way to help with managing:
- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
If you want more background information on Maven you can check out The Philosophy of Maven and The History of Maven. Now let’s move on to how you, the user, can benefit from using Maven.
通过官网定义咱们能够晓得 maven 艰深来说就是 治理我的项目周期 的,包含了咱们最常听到的,编译,下载,依赖,部署等。
如何下载安装 Maven
这一步我就不再赘述了,网上轻易一搜就是一大堆
如何验证下载安装是否胜利呢(个别是配了零碎环境的),在命令行的任一个目录下输出mvn -v
,呈现相似以下信息则阐明配置胜利,包含了 mvn 的版本号。
基本概念和配置
在构建一个 maven 利用之前能够先来讲下对于仓库的基本概念和一些必要的配置。
- 本地仓库:在本地 pc 中划分一个文件夹来存储 jar 包
- 核心仓库:maven 官网对立治理 jar 包的仓库
- 近程仓库:本人或者公司搭建的给外部团队应用的 jar 包的仓库
当引入一个依赖的时候
- 去本地仓库寻找是否有 jar 包
- 如果没有则去 maven 治理的核心仓库去寻找
- 如果地方仓库还没有,就会去近程仓库寻找,如果连近程仓库都没有创立,那么间接抛出谬误,找不到依赖
- 有近程仓库,然而近程仓库也找不到须要的 jar 包,同样会抛出谬误,找不到依赖
除此之外,还有一个 镜像 的概念,只有仓库 A 可能蕴含仓库 B 所有的 jar 包,那么就能够说 A 是 B 的镜像。因为一些不可抗因素,有时候拜访不了核心仓库,这时候就须要用阿里云或者其余的镜像仓库来进步拜访效率。
目前为止只须要理解这几个概念,理解完后就是进行设置,对本地仓库的地位、镜像仓库的 url 和近程仓库的 url 设置。
默认的配置文件门路是${user.home}/.m2/settings.xml
,默认的本地仓库地址是${user.home}/.m2/repository/
能够看到有两个层级,一个是用户级别的批改,那么配置文件就是对应${user.home}/.m2/settings.xml
,另外一个是全局批改,也就是对所有用户都失效,那么配置文件的门路对应的则是${maven.home}/conf/settings.xml
批改本地仓库地位
增加镜像地址
配置近程仓库
在配置镜像和近程仓库的时候,记得 id 标签是全局惟一的
查看以后失效的配置文件,能够采纳mvn help:effective-settings
能够看到配置文件中去掉了多余正文的局部,只留下了方才手动配置的本地仓库和镜像仓库的地位。
搭建第一个 maven 利用
应用命令行来搭建第一个 maven 利用,当前可能 99.99% 的状况都是间接通过 idea 来搭建
mvn -B archetype:generate -DgroupId=com.maven.learn.cutey -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
能够先不论这串命令是啥意思,等前面讲了再回过头来看会有种不一样的感觉,生成我的项目后应用 tree 来看我的项目的目录构造长啥样
有个 pom.xml,也就是前面常说的 pom 文件,全名Project Object Model
我的项目对象模型文件,形容这个我的项目的。
<?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.maven.learn.cutey</groupId>
<artifactId>my-first-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<name>my-first-maven</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>
<!-- 省略了一些插件 -->
</build>
</project>
有几个十分罕用的标签
groupId
也就是组织 id,个别是公司的域名倒写artifactId
能够简略的了解为我的项目 id,个别是通过groupId:artifactId
来定位一个 jar 包dependencies
依赖,能够艰深的了解为 jar 包
其余的都能够顾名思义,这里就不再一一解释。
常用命令
编译 compile
在平常会应用 javac 来编译失去 class 文件来执行,在 maven 中也有相似的命令,应用mvn compile
对我的项目进行编译。编译实现后再看下文件目录构造,能够发现多了 target 目录,而后对应的门路上也有了 class 文件。
进到 classes 文件夹下,应用 java 命令行启动 java 文件,能够发现能失常运行
测试 test
在下面的目录构造中,除了 main 文件夹,还有一个 test 文件夹目录,也就是常说的测试用例目录。
默认的测试用例比较简单,没有什么好说的。能够应用mvn test
来运行测试用例
测试用例可能跑胜利,而后再次应用 tree 来看下目录构造
能够看到又减少了一些文件,其中 surefire-reports 是 maven 的一个插件。还有一个值得注意的点是看到了testCompile
,阐明是mvn test
也是通过编译后才运行的
那么 mvn test-compile
即可达到 只编译不运行 的成果。
打包 package
真实情况下个别是不会编译所有的文件,而后放在服务器上跑 class 文件的,而是把我的项目打包成一个 jar 包运行,或者打成 war 包部署在服务器的 tomcat 上运行。
应用mvn package
即可依照进行打包,打包完后应用tree
查看目录构造
赫然能够看到有个 jar 包生成,而后应用 java -jar
命令行执行 jar 包。然而,在这个例子里是会报错的。
上网查找材料后发现是短少了主启动类的入口,不过在之后的 springboot 我的项目中没有这种懊恼,应该是曾经配好了,感兴趣的同学能够一层一层地看下 spring 的 pom 文件。解决办法是在 pom 文件退出以下代码。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.maven.learn.cutey.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
留神
<plugins>
是放在 build 标签下,而不是 pluginManagement 标签下
再来应用java -jar
执行 jar 包,能够看到可能正确执行。
下载到本地 install
实现了以上的工作后,去本地的 jar 包上看是还没有的。
然而在事实的开发环境中,一个 project 是由多个 module 组成的,各个 module 之间可能须要援用依赖,这就可能要求把开发好的 module 下载到本地供其余 module 应用。应用mvn install
即可实现上述要求
能够看到在对应的地位上曾经生成了 jar 包以及对应的版本号等,而所谓对应的地位也就是由咱们一开始自定义的 groupId 和 artifactId 独特组成。
革除 target 目录 clean
有些状况下可能须要革除编译生成的二进制文件,而后再编译,这就须要用到mvn clean
了
能够看到分明完后,目录构造又变得很洁净了。然而,留神,尽管 target 目录清空了,install 下载 jar 包到本地的 jar 包在本地仓库还是存在的。
骨架 archetype
archetype 的意思是原型,能够了解为模版或者骨架,但更实质地来说,它就是 maven 的一个插件。一开始搭建的第一个 maven 利用就是用到了 archetype,然而是在命令行中配好了抉择哪个模版(maven-archetype-quickstart),而后把 groupId 和 artifactId 都输出了。
mvn -B archetype:generate -DgroupId=com.maven.learn.cutey -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
这次试试不主动生成,采纳mvn archetype:generate
呈现了正告,说是在近程编录中找不到骨架,只加载了本地的,所以咱们只看到了 10 个 internal 的骨架,然而这不障碍下来的动作。所以这个报警能够不必管,如果有强迫症的小伙能够上网搜下解决方案。
默认抉择是 7,一看第 7 个,就是maven-archetype-quickstart
,这次为了不同,我手动抉择 10,也就是maven-archetype-webapp
,顾名思义就是 web 我的项目。
抉择完骨架后就是去仓库进行下载,并且让你填写 groupId 和 artifactId 和一些根本值
查看下目录构造
自定义骨架
下面两个例子都是采纳他人的骨架,然而可能自定义骨架呢,maven 是提供这种反对的。
首先生成骨架,在我的项目的根目录下,也就是和 pom 文件同级的目录下采纳mvn archetype:create-from-project
目录构造如下
其次切到 target 中的 archetype 目录下,先执行mvn install
,再执行mvn archetype:crawl
Build success 后去后面设置的仓库根目录下
能够看到多出了一个archetype-catalog.xml
文件,查看该文件内容
能够看到最新的,自定义的 archetype 也在该文件下,上面就尝试看能不能胜利应用自定义的骨架生成一个我的项目,照样执行mvn archetype:generate
能够看到第 11 个就是咱们本人的 archetype,同时能够发现,每个数字前面都跟着一个英文,internal 或者 local,其实还有一个 remote。有时候咱们只想要 local,或者只想要 remote,maven 也提供了这样的命令加一个-DarchetypeCatalog=xxx
即可。
比方,mvn archetype:generate -DarchetypeCatalog=local
就是只加载本地的骨架
途中默认抉择的是 2,然而 3 才是自定义的,同样输出一些必要的信息
创作不易,如果对你有帮忙,欢送点赞,珍藏和分享啦!
上面是集体公众号,有趣味的能够关注一下,说不定就是你的宝藏公众号哦!!!