Apache Maven是做什么的
maven系统架构
Maven
使用惯例优于配置的原则,要求在没有定制之前,所有的项目都有如下的结构:
一个 Maven
项目在默认情况下会产生JAR文件,JAR文件会放在 ${basedir}/target
下面。
Maven命令
mvn compile exec:java -Dexec.mainClass=${main}
这个命令的意思是在 compile
执行完后,执行运行Java的命令,具体执行哪个类是由 -Dexec.mainClass=${main}
参数指定的, ${mian}
是要换成具体的类的。
pom.xml
POM (Project Object Model)
1. Maven坐标
<groupId>com.youkeda.course</groupId>
<artifactId>app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
Maven
坐标决定了这个 maven
工程部署后存在仓库的文件位置,所以这个坐标信息是必须指定的。
groupId
像一个文件夹一样,命名和包比较一致。每个公司都有自己的groupId
,避免和其他公司重合,个人开发者也可以设置自己的groupId
.artifactId
有些像文件名一样,在一个groupId
内,它应该是唯一的,从规范上来说,只能使用小写的英文字母、.
、-
、_
。比如,app 、member.share
这些都OK。packaging
用来指定工程执行完要打包的文件格式,默认情况下,packaging
的值是jar
。如果没有声明这个标签,就是jar
。
packaging
的格式有: jar
, war
, ear
, pom
version
基本上遵守了软件工程中对版本号的约定。在 Maven 的世界里,会把一个工程分为两种状态,也是软件工程里最常用的规范。SNAPSHOT 表示当前工程还处于不稳定的阶段,随时可以修改,在开发的时候就会用这个。 RELEASE 表示稳定版本,正式发布的时候就用这个。可以不用特意加,因为只要不是
SNAPSHOT
就是RELEASE
。
版本号的约定:一般是三位数字来表示版本号, x.x.x
这样的格式 .有时也可能是两位版本,因为有些时候不需要主版本号,总之只要团队约定好就可以.
- 第一位表示主版本号 - 主版本号一般是团队约定的
- 第二位代表的是新增功能
- 第三位表示的是 bugfix 后的版本
还有一个约定,就是执行 mvn package/mvn install
命令生成的 jar 文件名是 [artifactId]-[version].jar
.
2. Maven 属性配置
属性配置就是用来做参数设置的. properties
内的标签可以自定义.
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
java.version
代表设置一个参数,值为1.8
maven.compiler.source
指定 Maven 编译时候源代码的 JDK 版本.project.build.sourceEncodin
指定工程代码源文件的文件编码格式,一般都设置为UTF-8
maven.compiler.target
这个参数作用是按照这个值来进行编译源代码,比如上面的例子中就是按照 JDK1.8进行编译.3. 依赖管理 dependencies
用于指定当前工程依赖其他代码库.一旦我们在 pom.xml 声明了 dependencies 信息, 会先去本地用户目录下的.m2
文件内查找对应的文件,如果没有找到就会触发从中央仓库下载行为.
其实可以看出<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
dependency
标签的内容就是 Maven 坐标 ,所以说只要有坐标就可以建立依赖.一般把别人写的代码库称为三方库,自己写的叫二方库
间接依赖是 mvn 成功的核心要素,简单来说,如果工程A依赖了 okhttp
库,而工程B依赖了工程A,那么工程B 就会自动依赖 okhttp
库.
4. 插件体系 plugins
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
这里声明了一个插件用于执行 maven compile
,maven 的插件也是放在中央仓库的坐标,也就是一切都是 jar
.