Maven的项目结构

maven的项目结构

  1. src目录下分为maintest目录,分别用于存放源码和测试代码。
  2. main目录下分为javaresource目录,分别用于存放java源码和静态资源文件(包括图片、配置文件等)。
  3. pom.xml是Maven的核心配置,包括项目的依赖、插件以及各种配置。
    <groupId><artifactId><version>用于唯一区别每个项目。
    • groupId一般用于指定组名称,命名规则一般和包名一致,一个组下面可以有很多个项目。
    • artifactId一般用于指定项目在当前组中的唯一名称。
    • version 代表项目版本。
      参考示例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
        <?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>org.example</groupId>
      <artifactId>MavenHelloWorld</artifactId>
      <version>1.0-SNAPSHOT</version>

      <properties>
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      </project>

导入依赖

<dependencies>中即可引入所需要的依赖。每个依赖需在<dependency>中,同样具有groupIdartifactIdversion三标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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>org.example</groupId>
<artifactId>JavaHelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖导入 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.14</version>
</dependency>
</dependencies>
</project>

依赖的额外属性

除上述三标签外,依赖还可以被添加<type><scope><optional><exclusions>以及<system>标签。

  • type:依赖类型,默认为jar。
  • scope:依赖的作用域。
    • compile:在编译、运行、测试时均有效。未指定依赖作用域时默认使用。
    • provided:在编译、测试时有效,运行时无效。
    • runtime:在运行、测试时有效,在编译时无效。
      最典型的便是JDBC驱动。我们使用的始终是其所提供的接口,不需要直接使用特定驱动中的类或是方法,因此只需在运行时包含即可。
      1
      2
      3
      4
      5
      6
      <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.34</version>
      <scope>runtime</scope>
      </dependency>
    • test:仅在测试时有效。
    • system:作用域和<scope>下的<provided>相同,但并不是从远程仓库获取依赖,而是从本地导入。如果<scope>system,则添加一个systemPath来指定jar文件的位置。
      参考示例:
      1
      2
      3
      4
      5
      6
      7
      <dependency>
      <groupId>org.example</groupId>
      <artifactId>extension</artifactId>
      <version>1.0</version>
      <scope>system</scope>
      <systemPath>D://maven/test.jar</systemPath>
      </dependency>
  • optional:依赖是否可选。
  • exclusions:消除传递性依赖。
    通过<exclusion>子标签可以确定要排除哪一个传递依赖。
    参考示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>6.1.14</version>
    <exclusions>
    <!-- 确定排除spring-context中的commons-logging模块 -->
    <exclusion>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    </exclusion>
    </exclusions>
    </dependency>

依赖的可选和排除

如果我们的项目引用了其他依赖,别人在引用我们的项目时,会连带引入我们的项目所使用的依赖。我们可以给依赖添加optional标签表示此依赖是可选的,默认在导入依赖时,不会导入可选的依赖。

1
<option>true</option>

如果我们在引入别人项目的时候,发生了上述情况,我们可以通过<exclusion>排除不必要的依赖。

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.test</groupId>
<artifactId>TestMaven</artifactId>
<version>1.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>
<!-- 可以不指定版本号,只需要组名和项目名称 -->
</exclusion>
</exclusions>
</dependency>

继承和多模块

一个Maven项目可以继承自另一个Maven项目,比如多个子项目都需要父项目的依赖,我们就可以使用继承关系来快速配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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">
<parent>
<groupId>org.example</groupId>
<artifactId>ParentModel</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ChildModel</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
/<properties>
</project>

通过<parent>标签,表示此项目是父项目的子项目,子项目直接继承父项目的groupId,并继承父项目的所有依赖。
我们还可以让父Maven项目统一管理所有的依赖,包括版本号等,子项目可以选取需要的作为依赖,而版本全由父项目管理,使用<dependencyManagement>标签,这样父项目就完全作为依赖统一管理。

1
2
3
4
5
6
7
8
9
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.34</version>
</dependency>
</dependencies>
</dependencyManagement>

依赖统一管理后,子项目只需要用什么拿什么,无需指定版本。但如果父项目在该标签外面依旧存在<dependencies>标签,其内部的依赖依旧是直接继承。