从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE概念

    • Ant

    • Maven

      • 什么是Maven
      • 安装Maven
      • 第一个Maven项目
        • 编写pom.xml
        • Maven的目录结构
        • 编写主代码
        • 编译主代码并运行
        • 编写测试代码并运行
        • 打包
        • 总结
      • Maven的组成和配置
      • 快速创建Maven项目
      • 创建Web项目
      • Maven的生命周期和构建
      • Maven的依赖管理
      • Maven的插件管理
      • IDEA关于Maven的设置
      • 使用Maven完成dao层
      • 使用Maven完成service层
      • 使用Maven完成web层
      • Maven的拆分和聚合
      • Nexus的搭建
      • Nexus的使用
      • 安装第三方jar包到私服
      • Maven系列完结
      • Maven
    • 日志

    • Junit

    • JDBC

    • XML和JSON

    • Java
  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • JavaEE
  • Maven
2023-05-15
目录

第一个Maven项目

# 20.第一个Maven项目

现在,我们从一个最简单的HelloWorld项目开始学习Maven。   ‍

# 编写pom.xml

类似Make的Makefile,Ant的build.xml一样,Maven也是通过配置文件来管理项目的,该文件就是pom.xml。

pom全称Project Object Model,项目对象模型,pom.xml里配置了项目的基本信息,如何构建,用到的依赖等等

‍

我们新建一个LearnJavaMaven的文件夹,并在里面新建一个pom.xml文件,输入以下内容:

<?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.peterjxl.LearnJavaMaven</groupId>
    <artifactId>hello-world</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Hello World Project!</name>
</project>
1
2
3
4
5
6
7
8
9
10

‍

我们逐行说明文件的内容:

  1. 代码的第一行是XML头,指定了该XML文档的版本和编码方式。
  2. 紧接着是project元素,project是pom.xml的根元素。
  3. modelVersion指定了当前POM模型的版本,对于Maven 2及Maven 3来说,它只能是4.0.0,这里不详细说明
  4. 接下来的三行是最重要的。这三行决定了一个项目的基本坐标,在Maven中,无论是寻找什么依赖,都是依靠坐标。groupId定义了项目属于哪个组,常见的方式是组织名+项目名,而组织名可以用倒置的域名(类似 Java 中包的管理)
  5. artifactId说明了该模块的ID,不同的模块ID不同。
  6. version指定了Hello World项目当前的版本——1.0-SNAPSHOT。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.0、1.1-SNAPSHOT、1.1、2.0等

‍

前面我们说了Maven有全局配置和用户配置,其实Maven还有第三个配置:针对单个项目的配置。说明如下:

  • Global (MAVEN_HOME/conf/settings.xml) 针对所有用户的配置
  • User(USER_HOME/.m2/settings.xml) 针对单个用户的配置
  • Project(PROJECT_ROOT/pom.xml) 针对单个项目的配置

‍

‍

# Maven的目录结构

在Maven出现之前,一千个项目就有一千个结构,例如

  • 有的项目中,源码目录是source,配置文件目录是config,构建方式使用Ant
  • 有的项目,源码目录则是src,配置文件则是setting,构建方式使用make
  • ......

而有了Maven后,全部项目使用统一的目录结构,这样能降低项目的学习成本。

之前我们说过,Maven采用了约定大于配置的设计,对于项目的目录结构,也有一定的约定。常见的Maven项目的目录结构如下:


LearnJavaMaven
├── pom.xml
└── src
    ├── main
    │   ├── java  --存放项目的.java 文件
    │   ├── resources  --存放项目资源文件,如 Log4j等框架的配置文件
    │   └── webapp  --页面资源,HTML,JS,CSS,图片等
    └── test
        ├── java  --存放所有单元测试.java 文件,如JUnit 测试类
        └── resources  --- 测试资源文件
1
2
3
4
5
6
7
8
9
10
11

在Maven中,默认项目的主代码目录是在src/main/java目录下,而测试用的代码则是在src\test\java目录下;resources目录则用来存放配置文件,webapp目录则是存放前端静态资源。

‍

后续我们使用Maven,都是基于这个结构来使用的,请读者务必知道这个结构。

我们根据上述约定,创建好对应的文件夹。

‍

‍

‍

# 编写主代码

我们在src/main/java目录下创建这样的目录:com\peterjxl\learnjavamaven\demo1

然后在里面创建一个HelloWorld类,代码如下:

package com.peterjxl.learnjavamaven.demo1;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello Maven!");
    }
}
1
2
3
4
5
6
7

‍

目前文件夹结构如下:

LearnJavaMaven
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── peterjxl
    │   │           └── learnjavamaven
    │   │               └── demo1
    │   │                   └── HelloWorld.java
    │   ├── resources
    │   └── webapp
    └── test
        ├── java
        └── resources
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

‍

# 编译主代码并运行

然后我们就可以用Maven编译了。在项目根目录下输入命令mvn clean compile​,输出如下:

> mvn clean compile
[INFO] Scanning for projects...
[INFO]
[INFO] --------------< com.peterjxl.LearnJavaMaven:hello-world >---------------
[INFO] Building Maven Hello World Project! 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hello-world ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-world ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello-world ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\Projects\LearnJavaMaven\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.567 s
[INFO] Finished at: 2023-04-11T08:02:20+08:00
[INFO] ------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

‍

输出内容有点多,我们不会全部讲解其内容,重点挑一两个重要的讲,其他的后面再说。

Maven会将构建的结果,放到项目根目录下的target文件夹,我们可以看第17行,意思是说将编译后的文件放到了target\classes目录下。

此时,我们目前的文件夹结构如下:

LearnJavaMaven
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── peterjxl
│   │   │           └── learnjavamaven
│   │   │               └── demo1
│   │   │                   └── HelloWorld.java
│   │   ├── resources
│   │   └── webapp
│   └── test
│       ├── java
│       └── resources
└── target
    ├── classes
    │   └── com
    │       └── peterjxl
    │           └── learnjavamavn
    │               └── demo1
    │                   └── HelloWorld.class
    ├── generated-sources
    │   └── annotations
    └── maven-status
        └── maven-compiler-plugin
            └── compile
                └── default-compile
                    ├── createdFiles.lst
                    └── inputFiles.lst
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

可以看到Maven帮我们生成了target文件夹,该文件夹就用于存放我们后续编译后的结果。

里面又有3个文件夹,我们重点看classes文件夹,可以看到Maven将我们的类编译好了。

我们可以试着运行:

cd ./target/classes
java com.peterjxl.learnjavamaven.demo1.HelloWorld
Hello Maven!
1
2
3

可以看到确实编译结果是正常的。至于我们用的Maven命令 mvn clean compile​​​,我们后续再讲,目前关键是运行起来项目。

‍

‍

# 编写测试代码并运行

在Java世界中, JUnit是事实上的单元测试标准。 要使用JUnit,首先需要为项目添加一个JUnit依赖, 修改项目的POM如代码清单:

<?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.peterjxl.LearnJavaMaven</groupId>
    <artifactId>hello-world</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Hello World Project!</name>

     <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

我们添加了第11至18行,<dependencies>​顾名思义就是很多依赖的意思,该标签体里可以放一个个<dependency>​的标签,每个标签对应一个具体的依赖,可以是Junit,也可以是JDBC。

这里我们添加了Junit的依赖,关于<dependency>​标签体里的内容,我们后续会讲解,目前知道这么回事就行。

‍

配置了测试依赖,就可以编写测试类,以之前的HelloWorld类为例,测试main方法。在src/test/java目录下创建对应的包和测试类HelloWorldTest.java,代码内容:

package com.peterjxl.learnjavamaven.demo1;
import org.junit.Test;

public class HelloWorldTest {

    @Test
    public void testMain() {
       HelloWorld.main(new String[10]);
    }
}
1
2
3
4
5
6
7
8
9
10

‍

‍

测试用例编写完毕之后就可以调用Maven执行测试。 运行mvn clean test​:观察最后的输出如下:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.peterjxl.learnjavamavn.demo1.HelloWorldTest
Hello Maven!
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.330 s
[INFO] Finished at: 2023-04-11T20:57:27+08:00
[INFO] ------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

可以看到测试结果为:1个测试用例被执行了,失败0个,错误0个,跳过0个(第10行)

‍

‍

# 打包

将项目进行编译、 测试之后,下一个重要步骤就是打包(package) 。pom.xml文件中没有指定打包类型, 默认打包类型jar。 简单地执行命令mvn clean package​进行打包,并观察最后的输出:

[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello-world ---
[INFO] Building jar: D:\Projects\LearnJavaMaven\target\hello-world-0.0.1-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.728 s
[INFO] Finished at: 2023-04-11T21:06:00+08:00
[INFO] ------------------------------------------------------------------------
1
2
3
4
5
6
7
8

Maven会在打包之前执行编译、 测试等操作,并在最后告诉我们打包结果。

可以看到第4行告诉我们打包成功了,第2行告诉我们包的路径在target目录下。

‍

‍

默认打包生成的jar是不能够直接运行的, 因为带有main方法的类信息不会添加到manifest中。打开jar文件中的META-INF/MANIFEST.MF文件, 将无法看到Main-Class一行。

​​

‍

为了生成可执行的jar文件, 需要借助一个插件maven-shade-plugin(什么是插件后续会讲), 我们配置pom.xml:

<?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.peterjxl.LearnJavaMaven</groupId>
    <artifactId>hello-world</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Hello World Project!</name>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.peterjxl.learnjavamaven.demo1.HelloWorld</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
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

主要添加了第20行到43行,该配置是构建(build)时的配置,并配置了主类是什么(第35行)

‍

然后我们再次执行mvn clean package​,并测试能否执行main方法:

cd target
java -jar hello-world-0.0.1-SNAPSHOT.jar
Hello Maven!
1
2
3

运行成功。后续我们开发JavaWeb项目的时候,可以配置打包为war类型

‍

# 总结

本文我们简单讲解了Maven的目录结构,这里也放张图,可能更直观一点:

​​

‍

还介绍了pom.xml和一些简单的Maven命令。本文已将所有代码上传到Gitee (opens new window)和GitHub (opens new window)上,本文中涉及到的代码在分支demo1HelloWorld。

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2023/5/15 16:02:46
安装Maven
Maven的组成和配置

← 安装Maven Maven的组成和配置→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式