maven标签小解

maven

细说一下maven中的遇到的各种标签,遇到不懂得都会在此更新。

2021-8-30 更~

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <optional>true</optional>
    <scope>compile</scope>
    <type>jar</type>
</dependency>

<dependencyManagement> 标签

用于同一管理依赖的版本。

两个项目A和B,其中A为父项目,B为子项目。在父项目A的pom.xml中定义如下:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

那么在B项目中引用同样的测试类无需再填写版本号。(注意父项目需要提前加载依赖,加载的同时需要先去除标签,否则无法加载。)

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
</dependencies>

<optional> 标签

举例子说明:两个项目A和B,其中A为父项目,B为子项目。在父项目A中引入了单元测试的依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <optional>true</optional>
</dependency>

optional标签的默认值是false,当其为true时,表示当前依赖jar是可选的,项目之间不会进行传递。

即父项目A依赖junit单元测试依赖,而子项目B依赖junit单元测试依赖。

好处是:打包B项目的时候,不会包含junit单元测试的jar,节省空间。

<scope> 标签

scope元素主要用来控制依赖的使用范围,指定当前包的依赖范围和依赖的传递性,也就是哪些依赖在哪些classpath中可用。常见的可选值有:compile, provided, runtime, test, system等。

compile(编译)

默认值。compile表示对应依赖会参与当前项目的编译、测试、运行等,是一个比较强的依赖。打包时通常会包含该依赖,部署时会打包到lib目录下。比如:spring-core这些核心的jar包。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
test(测试)

scope为test表示依赖项目仅参与测试环节,在编译、运行、打包时不会使用。最常见的使用就是单元测试类了:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

类似单元测试这样的依赖,如果不设置scope为test,很显然它们会被打包、发布,但其实真是环境中并无什么作用。

runntime(运行时)

runntime仅仅适用于运行和测试环节,在编译环境下不会被使用。比如编译时只需要JDBC API的jar,而只有运行时才需要JDBC驱动实现。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
    <scope>runtime</scope>
</dependency>
provided(已提供)

provided适合在编译和测试的环境,和compile功能相似,但provide仅在编译和测试阶段生效,provide不会被打包,也不具有传递性。

比如:上面讲到的spring-boot-devtools、servlet-api等,前者是因为不需要在生产中热部署,后者是因为容器已经提供,不需要重复引入。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>
system

system范围依赖与provided类似,不过依赖项不会从maven仓库获取,而需要从本地文件系统提供。使用时,一定要配合systemPath属性。不推荐使用,尽量从Maven库中引用依赖。

<dependency>
  <groupId>sun.jdk</groupId>
  <artifactId>tools</artifactId>
  <version>1.5.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

复杂点儿的例子:

有A、B、C三个项目,C依赖B,B依赖A。此时根据scope和optional的不同可以决定C依赖不依赖A。

  • 当B通过test、provided依赖A 或者 依赖A的optional为true,则C不依赖A
  • 当B通过testruntime、compile依赖A 或者 依赖A的optional为false,则C依赖A

其中B依赖A,C依赖B,传递性的关键是B依赖A时所设置的scope值,当B采用不同的值时对应的依赖关系如下:当B通过test或provided依赖A时,C不依赖A;当B通过runtime或compile依赖A时,C依赖A;

<type> 标签

引入某一个依赖时,必须指定type,这是因为用于匹配dependency引用和dependencyManagement部分的最小信息集实际上是{groupId,artifactId,type,classifier}。
在很多情况下,这些依赖关系将引用没有classifier的jar依赖。这允许我们将标识设置为{groupId,artifactId},因为type的默认值是jar,并且默认classifier为null。
type的值一般有jar、war、pom等,声明引入的依赖的类型

2021-8-27 更~

基础篇

<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>
	<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
    <groupId>com.justloseit.common</groupId>
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>justloseit1.0</artifactId>
    <!-- 版本号 -->
    <version>1.0-SNAPSHOT</version>
    <!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->
    <packaging>pom</packaging>
    
</project>    

父子篇

<parent>
    <!--被继承的父项目的构件标识符 -->
        <artifactId>justloseit1.0</artifactId>
    <!--被继承的父项目的全球唯一标识符 -->
        <groupId>com.justloseit.common</groupId>
    <!--被继承的父项目的版本 -->
        <version>1.0-SNAPSHOT</version>
    <!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。
		默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项 
        目的pom,其次在文件系统的这个位置(relativePath位置),
		然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->
        <relativePath>../pom.xml</relativePath>
</parent>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值