首页 > 其他分享 >[Maven] 02 - POM模型与常见插件

[Maven] 02 - POM模型与常见插件

时间:2024-01-12 22:35:01浏览次数:42  
标签:02 maven 插件 依赖 项目 Maven xml

POM 模型

1 依赖关系

Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。

通俗理解:

依赖谁就是将谁的 jar 包添加到本项目中。可以依赖中央仓库的 jar,也可以依赖当前开发中其他项目打包后的 jar 包。

在 pom.xml 文件根元素 project 下的 dependencies 标签中,配置依赖信息,可以包含多个 dependence 元素,以声明多个依赖。每个依赖 dependence 标签都应该包含以下元素:groupId, artifactId, version : 依赖的基本坐标, 对于任何一个依赖来说,基本坐标是最重要的, Maven 根据坐标才能找到需要的依赖。

依赖的传递性

依赖传递性是 Maven2.0 的新特性。假设你的项目依赖于一个 jar 包,而这个 jar 包又依赖于其他 jar 包。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的 jar 包的坐标,Maven 会隐式的把这些 jar 包间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖 jar 包的项目文件实现的。这些项目的所有依赖都会加入到项目中这就是依赖传递性。

如果 A 依赖了 B,那么 C 依赖 A 时会自动把 A 和 B 都导入进来。创建 A 项目后,选择 IDEA 最右侧 Maven 面板 lifecycle,双击 install 后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目。

依赖相同资源的依赖原则

1.2.1 第一原则:最短路径优先原则

“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设 A、B、C 之间的依赖关系是 A->B->C->D(2.0)和 A->E->(D1.0),那么 D(1.0)会被使用,因为A 通过 E 到 D 的路径更短。

1.2.2 第二原则:最先声明原则

依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和 Y(2.0)的依赖路径长度是一样的,都为 2。那么到底谁会被解析使用呢?

在 maven2.0.8 及之前的版本中,这是不确定的,但是 maven2.0.9 开始,为了尽可能避免

构建的不确定性,maven 定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度

相等的前提下,在 POM 中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖

优胜。

1.3 排除依赖

exclusions: 用来排除传递性依赖 其中可配置多个 exclusion 标签,每个 exclusion 标签

里面对应的有 groupId, artifactId 两项基本元素。

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.2.4.RELEASE</version>
    <exclusions>
         <exclusion>
             <groupId>org.springframework</groupId>
             <artifactId>spring-aop</artifactId>
         </exclusion>
   </exclusions>
</dependency>

继承关系

什么是继承关系

Maven 中的继承跟 Java 中的继承概念一样,需要有父项目以及子项目。我们可以将项目中的依赖和插件配置提取出来在父项目中集中定义,从而更方便的管理项目的依赖以及插件。注意父项目类型一定为 POM 类型。

继承的优点

1) 依赖或插件的统一管理(在 parent 中定义,需要变更 dependency 版本时,只需要修改一处)。

2) 代码简洁(子 model 只需要指定 groupId,artifactId 即可)。

3) dependencyManagement 是“按需引入”,即子 model 不会继承 parent 中dependencyManagement 所有预定义的 dependency。

Maven 中的多继承

在 Maven 中对于继承采用的也是单一继承,也就是说一个子项目只能有一个父项目,但是有的时候我们项目可能需要从更多的项目中继承,那么我们可以在子项目中通过添加<dependencyManagement>标记来实现多继承。在子项目的<dependencyManagement>中每个<dependency>标记就一个父工程定义,同时还需要添加<type>标记,值为 pom。添加<scope>标记,值为import。

<dependencyManagement>
<dependencies>
    <!-- 父项目 a-->
    <dependency>
        <groupId>com.lin</groupId>
        <artifactId>parent_a</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
<!-- 父项目 b-->
    <dependency>
        <groupId>com.lin</groupId>
        <artifactId>parent_b</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>
</dependencyManagement>

聚合关系

Maven 的聚合特性可以帮助我们把多个项目基于多个模块聚合在一起,这样能够更加方便项目的管理。

前提:继承。

聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为 pom 类型。同时在父项目的 pom.xml 中出现<modules>表示包含的所有子模块。即使在 idea 中,也可以使用聚合在一个窗口创建多个项目。

创建聚合模块

1.创建父工程pom

2.右键父模块,→module

删除聚合模块步骤

右键模块--> remove module

右键项目 --> delete

在父项目中 pom.xml 中<modules>中删除模块名


Maven 内置插件

Maven 自身拥有很多内置插件,每一个内置插件都代表了 Maven 的一种行为。Maven在管理项目整个生命周期时,在不同的阶段处理的过程都是使用插件来具体完成。如:

构建项目时使用构建插件、

编译项目时使用编译插件、

清除构建使用清除构建的插件、

测试项目时使用测试插件、

打包时使用资源拷贝插件以及打包插件。

我们可以在不同阶段使用 Maven 中的不同命令来触发不同的插件来执行不同的工作。换言之,Maven 的插件是需要依赖命令来执行的。Maven 在管理插件时也是通过坐标的概念和管理依赖的方式相同,通过坐标来定位唯一的一个插件。

在一般情况下,我们不需要额外配置 Maven 的内置插件,除非我们需要对插件做额外配置时才需要配置内置插件。如果我们重新配置了内置插件,那么则以我们配置的为主。

Maven 的插件配置需要在 pom.xml 文件中的<build>标签中使用<plugins>来配置。现在在很多的 IDE 中都已经把 Maven 的常用命令通过界面中的按钮来体现,我们只要点击相应的按钮就等同于执行了相应的命令。

配置编译插件

在 setings.xml 中配置全局编译插件(了解就好,因为最早就配置了)

<profile>
<!-- 定义的编译器插件 ID,全局唯一 -->
<id>jdk-1.8</id>
<!-- 插件标记,activeByDefault 默认编译器,jdk 提供编译器版本 -->
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<!-- 配置信息 source-源信息,target-字节码信息,compilerVersion-编译过程版
本 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>

在 pom.xml 文件中配置局部的编译插件

<build>
   <plugins>
       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>3.8.1</version>
             <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
                  <encoding>UTF-8</encoding>
             </configuration>
        </plugin>
   </plugins>
</build>

资源拷贝插件

Maven 在打包时默认只将 src/main/resources 里的配置文件拷贝到项目中并做打包处理,而非 resource 目录下的配置文件在打包时不会添加到项目中。我们在使用 MyBatis时,如果接口与 Mapper 文件在同一个目录中,在默认的情况下 Maven 打包的时候,对于src/main/java 目录只打包源代码,而不会打包其他文件。所以 Mapper 文件不会打包到最终的 jar 文件夹中,也不会输出到 target 文件夹中,此时运行代码操作数据库时会报异常。

解决方案:

1) 将 Mapper 文件放入到 resources 目录中。(推荐)

2) 配置资源拷贝插件,指定其拷贝文件的位置。

<resources>
       <resource>
              <directory>src/main/java</directory>
               <includes>
               <include>**/*.xml</include>
              </includes>
             </resource>
        <resource>
       <directory>src/main/resources</directory>
           <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
       </includes>
            </resource>
</resources>

扩展插件

Tomcat 插件

Tomcat 插件是 Maven 的扩展插件,其作用是为基于 Maven 开发的 Web 项目提供一个内置的 Tomcat 支持,这样我们在开发阶段可以不在依赖外部的 Tomcat 来运行 Web 项目,该插件目前使用的 Tomcat 版本为 Tomcat7。该插件的作用很强大,除了提供了 Tomcat以外,还可以通过该插件实现项目的远程热部署。

<build>
    <plugins>
        <!-- 配置 Tomcat 插件 -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <!-- 配置 Tomcat 监听端口 -->
                <port>8080</port>
                <!-- 配置项目的访问路径 (Application Context) -->
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

Mybatis Generator 插件

Mybatis Generator 插件可以根据数据库自动生成实体类、单表查询接口映射 xml 文件以及 POJO。

1.创建 Users 表

CREATE TABLE `users` (
`userid` int(11) NOT NULL,
`username` varchar(20) DEFAULT NULL,
`userage` int(11) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.修改 POM 文件,添加插件

<build>
    <plugins>
        <!-- 配置 Generator 插件 -->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.38</version>
                </dependency>
            </dependencies>
            <!-- 指定配置文件的路径 -->
            <configuration>
                <configurationFile>${project.basedir}/src/main/resources/generato
                    rConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    </plugins>
</build>

添加 generator 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
	<context id="testTables" targetRuntime="MyBatis3">
		<!-- 生成实体类实现序列化-->
		<plugin type="org.mybatis.generator.plugins.SerializablePlugin"  />
		<!-- 实体类中包含toString() -->
		<plugin type="org.mybatis.generator.plugins.ToStringPlugin" ></plugin>
		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是 : false:否 -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>
		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
		<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" userId="root"
			password="123456">
		</jdbcConnection>
		<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
			NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!-- targetProject:生成PO类的位置 -->
		<javaModelGenerator targetPackage="com.lin.pojo"
			targetProject=".\src\main\java">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="com.lin.mapper"
			targetProject=".\src\main\java">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage:mapper接口生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.lin.mapper"
			targetProject=".\src\main\java">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 指定数据库表 -->
		<table schema="" tableName="t_user"></table>

	</context>
</generatorConfiguration>

添加 generator 配置文件的 DTD 文件

运行 generator 插件生成代码


插件管理

在 Maven 中提供了和依赖管理相同的方式用于来管理插件,我们可以在父工程中声明插件,然后在具体的子项目中按需引入不同的插件。

父工程 POM

<pluginManagement>
    <plugins>
        <plugin>
             <groupId>org.apache.tomcat.maven</groupId>
             <artifactId>tomcat7-maven-plugin</artifactId>
             <version>2.2</version>
        </plugin>
         <plugin>
              <groupId>org.mybatis.generator</groupId>
              <artifactId>mybatis-generator-maven-plugin</artifactId>
              <version>1.3.5</version>
         </plugin>
     </plugins>
</pluginManagement>

子工程 POM

<plugin>
         <groupId>org.apache.tomcat.maven</groupId>
         <artifactId>tomcat7-maven-plugin</artifactId>
         <configuration>
<!-- 配置 Tomcat 监听端口 -->
          <port>8080</port>
<!-- 配置项目的访问路径 (Application Context) -->
          <path>/</path>
          </configuration>
</plugin>
<!-- 配置 Generator 插件 -->
<plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
</dependencies>
<!-- 指定配置文件的路径 -->
<configuration>
       <configurationFile>${project.basedir}/src/main/resources/generato
       rConfig.xml</configurationFile>
        <verbose>true</verbose>
         <overwrite>true</overwrite>
</configuration>
</plugin>

标签:02,maven,插件,依赖,项目,Maven,xml
From: https://www.cnblogs.com/lidabo/p/17961714

相关文章

  • 2024.1.12 闲话
    第一次写闲话,写得不好请见谅。最近总算是从一个深渊中脱离出来了。我意识到,现在自己无论是喜欢些什么,还是想要些什么,一些并不是现在所必需,也并不是现在该去关注的东西本就不应该占据我太多的时间。有句话说,其实一个人需要的东西很少,但是想要的东西很多。我觉得这话能够解释许许......
  • [AGC022F] Checkers 题解
    题目链接点击打开链接题目解法很妙的题!!!考虑\(x\)是无穷大的数,所以可以认为\(x^i\)的系数是单独的一项,不会和\(x^j(j\neqi)\)合并所以问题转化成了:每个数初始是\(x^i\)(\(x\)可以理解是元),进行题目中的操作,问最后形成的\(n\)次多项式的个数由\(B\)向\(A\)连边,这......
  • P8368 [LNOI2022] 串
    题面传送门首先我们可以说明,一定存在一个最优方案,使得最后一个串的右端点是\(n\)。因为如果不是\(n\),那么可以往后扩展一个,或者整体前移一位之后再往后扩展一位。然后我们可以说明,如果后缀\([i,n]\)存在一种方案使得其是最后一个,那么\([j,n](j>n)\)也存在一种方案。所以......
  • 2024.1.12做题纪要
    2-SAT考场的时候直接不考试去学了,板子还挺简单的。SOV#include<bits/stdc++.h>intN,M;intcnt,head[2100000],next[4100000],to[4100000];voidAddEdge(intu,intv){++cnt;next[cnt]=head[u];head[u]=cnt;to[cnt]=v;}boolvisi......
  • 2024,传统鞋服的“高端梦”该醒了
    文|螳螂观察作者|图霖“一千块都不要的波司登,宝贝们还不冲吗?”入夜,一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重,想从主播那得到关于合适尺码的回复。一串串跳动的数字随即铺满左下角的屏幕,速......
  • 新火种AI|“赌城”上演“科技春晚”,AI硬件将在2024年大爆发
    作者:一号如果说2023年是生成式AI元年,那么2024年将会是AI硬件的元年。众所周知,拉斯维加斯是一座纸醉金迷的“赌城”,去年落成的巨型网红球也赚足了眼球。但现在,一场“科技春晚”正在这座城市上演。当地时间2024年1月9日至12日,2024年国际消费电子展(CES2024)在美国拉斯维加斯举办。作为......
  • 2024 爱分析 · AI 与大模型高峰论坛:和鲸喜获两项殊荣!
    1月9日下午,“2024爱分析·AI与大模型高峰论坛”在京举办。本次论坛以“智能涌现,价值焕新”为主题,汇聚众多专家学者、实践先驱,共同探讨AI与大模型在企业内的新场景、新价值、新路径。论坛中,和鲸科技成功入选“2023爱分析·大模型‘璀璨星辰’Top榜单”,并荣获“2023......
  • 2024 年 AI 技术应用趋势的预测
    生成式AI从年初开始崭露头角,到年末已经引起了轰动。许多企业正在竞相依靠AI提取文本、语音和视频的能力,生成能够彻底改变生产力、创新和创造力的新内容。企业纷纷顺势而为。麦肯锡表示,像OpenAI的ChatGPT这样的深度学习算法在经过企业数据的进一步训练后,每年可在63个业务......
  • 2024,新酒饮如何与年轻人再碰杯?
    文|螳螂观察作者|易不二2012年,江小白拉着各怀心事的年轻人尝了第一口白酒,砸碎了白酒“只藏在窖里”的天花板。经历短暂高光,并不适口的江小白归于寂寥之后,又靠着果立方与梅见“梅开二度”。比江小白更早,主打预调鸡尾酒的锐澳,在低度酒赛道蛰伏多年后,等到了新酒饮潮流的到来,迎来了......
  • idea安装插件后报错打不开怎么办,两步教会你
    解决方法:老版本的插件路径:C:\Users\用户名\.IntelliJIdea20xx.X\config\plugins找到这个路径下:C:\Users\用户名\.IntelliJIdea20xx.X\config\plugins 删除 刚才安装的插件就可以了,如果你忘记了你安装插件的名称,那么可以根据安装时间来进行筛选新版本的插件路径:2020以上的版本的......