Maven基础 - 图1

Apache Maven是做什么的

maven系统架构

image.png
Maven 使用惯例优于配置的原则,要求在没有定制之前,所有的项目都有如下的结构:
一个 Maven 项目在默认情况下会产生JAR文件,JAR文件会放在 ${basedir}/target 下面。
image.png

Maven命令

mvn compile exec:java -Dexec.mainClass=${main}
这个命令的意思是在 compile 执行完后,执行运行Java的命令,具体执行哪个类是由 -Dexec.mainClass=${main} 参数指定的, ${mian} 是要换成具体的类的。

pom.xml

POM (Project Object Model)

Maven基础 - 图4

1. Maven坐标

  1. <groupId>com.youkeda.course</groupId>
  2. <artifactId>app</artifactId>
  3. <packaging>jar</packaging>
  4. <version>1.0-SNAPSHOT</version>

Maven 坐标决定了这个 maven 工程部署后存在仓库的文件位置,所以这个坐标信息是必须指定的。

  1. groupId 像一个文件夹一样,命名和包比较一致。每个公司都有自己的 groupId ,避免和其他公司重合,个人开发者也可以设置自己的 groupId .

  2. artifactId 有些像文件名一样,在一个 groupId 内,它应该是唯一的,从规范上来说,只能使用小写的英文字母、 .-_ 。比如, app 、member.share 这些都OK。

  3. packaging 用来指定工程执行完要打包的文件格式,默认情况下, packaging 的值是 jar 。如果没有声明这个标签,就是 jar

packaging 的格式有: jar , war , ear , pom

  1. version 基本上遵守了软件工程中对版本号的约定。在 Maven 的世界里,会把一个工程分为两种状态,也是软件工程里最常用的规范。

    SNAPSHOT 表示当前工程还处于不稳定的阶段,随时可以修改,在开发的时候就会用这个。 RELEASE 表示稳定版本,正式发布的时候就用这个。可以不用特意加,因为只要不是 SNAPSHOT 就是 RELEASE

版本号的约定:一般是三位数字来表示版本号, x.x.x 这样的格式 .有时也可能是两位版本,因为有些时候不需要主版本号,总之只要团队约定好就可以.

  • 第一位表示主版本号 - 主版本号一般是团队约定的
  • 第二位代表的是新增功能
  • 第三位表示的是 bugfix 后的版本

还有一个约定,就是执行 mvn package/mvn install 命令生成的 jar 文件名是 [artifactId]-[version].jar .

2. Maven 属性配置

属性配置就是用来做参数设置的. properties 内的标签可以自定义.

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <maven.compiler.source>${java.version}</maven.compiler.source>
  4. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  5. <maven.compiler.target>${java.version}</maven.compiler.target>
  6. </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 文件内查找对应的文件,如果没有找到就会触发从中央仓库下载行为.
    1. <dependencies>
    2. <dependency>
    3. <groupId>com.alibaba</groupId>
    4. <artifactId>fastjson</artifactId>
    5. <version>1.2.62</version>
    6. </dependency>
    7. </dependencies>
    其实可以看出 dependency 标签的内容就是 Maven 坐标 ,所以说只要有坐标就可以建立依赖.

    一般把别人写的代码库称为三方库,自己写的叫二方库

间接依赖是 mvn 成功的核心要素,简单来说,如果工程A依赖了 okhttp 库,而工程B依赖了工程A,那么工程B 就会自动依赖 okhttp 库.

4. 插件体系 plugins

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <version>3.8.1</version>
  7. </plugin>
  8. </plugins>
  9. </build>

这里声明了一个插件用于执行 maven compile ,maven 的插件也是放在中央仓库的坐标,也就是一切都是 jar .