转载

maven入门

maven入门

Maven

What is Maven?

  1. 构建规范项目的工具
  2. 项目管理工具,进行打包,测试,部署
  3. 具有一套规范

POM

What is POM

  1. Maven的基本工作单元
  2. xml文件
  3. 存储Maven项目的配置文件(Maven的命令都是先从POM读取命令,然后执行命令)

Super POM

Maven的默认POM文件,如果POM文件没有指定父POM文件,那么配置都是集成Super POM

Minimal POM

POM文件的最低需要的配置元素:

  1. project
  2. groupId:一般是组织名称
  3. artifactId:项目的名称
  4. version:项目的版本号

Maven项目的完全限定名:

groupId:artifactId:version

packaging元素默认是JAR,还有其他选项是WAR,EAR等等

Project Inheritance

之前在Super POM一节谈到指定了父POM的继承指定父POM的配置,实现如下:

.
 |--my-app
 |    |-- my-module
 |    |   `-- pom.xml
  `-- pom.xml
my-app的POM
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>
my-module的POM
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

修改my-module的POM,即可实现讲my-app作为一个父POM继承给my-module,实现如下:

my-module的POM
<project>
  <parent>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

如果my-app不是作为my-module的父目录,如下:

.
 |-- my-module
 |   `-- pom.xml
 `-- my-app
     `-- pom.xml

需要配置<relativePath>属性,配置相对my-module的相对路径如下:

<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
    <relativePath>../parent/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-module</artifactId>
</project>

Project Aggregation

如果我们想要对一些模块都需要执行相同的命令,但是不想进入每一个模块下进行执行命令,可以使用Aggregation.

目录结构

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

将my-module模块聚合到my-app,修改my-app的POM文件如下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>my-module</module>
  </modules>
</project>
  1. <packaging>属性设置未pom
  2. <module>属性是相对于my-app的相对路径
  1. 有些命令不能同时执行
  2. Inheritance和Aggregation可以混合使用

Project Interpolation and Variables

Maven的设计哲学就是不要重复自己,所以当一些配置是相同的时候,我们可以使用自己定义的变量和预定义好的变量.

比如我们要使用projcet的version给其他配置项,我们可以如此使用

<version>${project.version}</version>

我们也可以使用自己定义的变量,比如我们定义了一个mavenVersion变量,我们可以如此使用

<project>
  ...
  <properties>
    <mavenVersion>2.1</mavenVersion>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-artifact</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-project</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
  </dependencies>
  ...
</project>

Standard Directory Layout

我们在思考Maven是什么的时候,其中有一个理解就是Maven是一套规范,那么这些规范体现在哪里呢,体现在他的项目目录的结构

目录 解释
src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/webapp Web application sources
src/test/java Test sources
src/test/resources Test resources
src/test/filters Test resource filter files
src/it Integration Tests (primarily for plugins)
src/assembly Assembly descriptors
src/site Site
LICENSE.txt Project's license
NOTICE.txt Notices and attributions required by libraries that the project depends on
README.txt Project's readme

Compile

  1. 编译主代码(即是除去测试代码)

命令:

mvn compile
  1. 切换目录到需要执行编译的项目的pom.xml文件目录下
  2. 首先Maven先去下载编译需要的插件和依赖
  3. 将编译的文件放在 ${basedir}/target/classed
  4. 编译测试代码

命令:

mvn test-compile
  1. 该命令不会进行测试

Test

命令:

mvn test
  1. 如果没有执行mvn compile命令编译,则会先进行编译。
  2. 同时也需要下载测试需要的插件

install

我们执行编译的或者测试的时候会将需要依赖下载到本地仓库(一般在${user.home}/.m2/repository)中,供我们的项目使用。那么我们是不是也可以讲自己的项目给其他项目使用呢?

  1. 先打包
  2. 后安装

Packaging

命令:

mvn packaging

该命令会将打包好的文件(如果我们在POM文件设置packaging是jar,那就打成jar包,以此类推)放在目录${basedir}/target

Install

命令:

mvn install

surefire插件会查找项目中特定命名约定的文件

  • **/*Test.java
  • **/Test*.java
  • **/*TestCase.java

默认排除:

  • **/Abstract*Test.java
  • **/Abstract*TestCase.java

Clean

命令:

mvn clean

只将${basedir}/target里面的文件清除

External Dependencies

命令:

<dependencies>
    ...
    <dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  1. groupId,artifactId,version就是我们一开始所说的项目的定位必备三项。
  2. scope代表在何时使用一般有个compile(编译),test(测试),runtime(运行)
  3. 那么我们引用的这些第三方的库从哪里下载呢?从我们repository属性配置
<repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
原文  https://segmentfault.com/a/1190000019540726
正文到此结束
Loading...