【maven】自定义maven插件和使用和常用maven命令

java 专栏收录该内容
2 篇文章 0 订阅

maven命令和生命周期
我们在执行mvn clean 这个命令的时候,触发了Maven生命周期的clean周期,在这个周期内clean插件来帮我们执行了清理动作。

Maven 是一个插件执行框架。通过插件在不同的时期,做不同的事情。我们把不同的时期,总结为Maven的生命周期,而做不同事情的本体就是插件。

properties
定义版本号变量

 <properties>
        <spark.version>2.4.7</spark.version>
 </properties>

modules

<modules>
        <module>aaa</module>
</modules>

子module中的maven是相互独立的,打包的时候只会包含本module的包
子module中如果没有maven依赖,全部继承父module,子module打包的时候lib会将全部打入到jar中
建议子module单独管理自己的依赖
多个module项目的创建
parent
指定一个项目的父级项目pom,父级项目中可能定义了子项目中很多jar包的版本。所以有时候找不到子项目里面突然冒出来的一个版本变量,可能定义在parent的pom中

dependencies
引入了一个jar包之后,这里如果没有加上version版本号的话,那么maven就会去dependencyManagement里找对应groupId和artifactId的jar,如果有就继承他,如果没有就会报错,这时候其实在我们配置的本地仓库中会真实的下载对应的jar包,这时候所有的子module都会默认继承这里面所有声明的jar

dependencyManagement
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。

使用优点
如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号。当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;另外如果某个子项目需要另外的一个版本,只需要声明version即可。

注意事项
dependencyManagement中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。

Dependency Scope
在POM 4中,中还引入了scope,它主要管理依赖的部署。目前scope可以使用5个值:

  • compile,缺省值,适用于所有阶段,会随着项目一起发布。
  • provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 //本机调试则注释, 集群运行则解开–>
  • runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
  • test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  • system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。让我们详细看一下每一种范围:

compile (编译范围)
表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去。

provided (已提供范围)表示容器已提供
该依赖在打包过程中,不需要打进去,这个由运行的环境来提供,比如tomcat或者基础类库等等,事实上,该依赖可以参与编译、测试和运行等周期,与compile等同。区别在于打包阶段进行了exclude操作。
适用场景:
1、承载项目的容器默认提供了该jar包,例如:java web项目需要使用相关servlet-api.jar,需要在pom中显式声明该jar,但是web容器例如:tomcat,提供该jar包支持。故无需在打包时将jar打包进来。
2、引用的父项目下有可能也声明了同类jar,在打包时设置provided可以排除引用该jar包因为版本问题导致的冲突和错误,减少包的大小。

runtime (运行时范围)
jar包只在运行时和测试时进行使用,在编译时和打包时并不会被引用,打包的lib目录不会存在该jar包

比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。
此类的驱动都是为runtime的类库。

test (测试范围)
被修饰的jar只在测试编译和执行阶段使用,不会在项目正常运行时和编译的时候使用。

system (系统范围)
与provided一样,被修饰的jar包并不会被打包到lib目录中,而是在运行时和编译时从特定的目录中去引用,而不是从maven的仓库中引用。需要同systemPath一起使用,指定依赖jar包的目录。

注:标签仅能与scope为system的属性一起使用,并且指定的路径为绝对路径。后续可能会被替代
systemPath
当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径,例如:

<dependency>
    <groupid>org.hamcrest</groupid>
    <artifactid>hamcrest-core</artifactid>
    <version>1.5</version>
    <scope>system</scope>
    <systempath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systempath>
</dependency>

其实dependency和dependencyManagement最少应该提供{groupId,artifactId,type,classifier}。在很多情况下, 因为type不写的时候默认值是jar并且默认classifier为null。所以可以只写groupId,artifactId
type的值一般有jar、war、pom等,声明引入的依赖的类型

dependency中type默认为jar即引入一个特定的jar包。那么为什么还会有type为pom呢?当我们需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的pom.xml文件过大。这个时候我们引进来一个type为pom,意味着我们可以将所有的jar包打包成一个pom,然后我们依赖了pom,即可以下载下来所有依赖的jar包

dependency中的classifier
Classifier可能是最容易被忽略的Maven特性,但它确实非常重要,我们也需要它来帮助规划坐标。设想这样一个情况,有一个jar项目,就说是 dog-cli-1.0.jar 吧,运行它用户就能在命令行上画一只小狗出来。现在用户的要求是希望你能提供一个zip包,里面不仅包含这个可运行的jar,还得包含源代码和文档,换句话说,这是比较正式的分发包。这个文件名应该是怎样的呢?dog-cli-1.0.zip?不够清楚,仅仅从扩展名很难分辨什么是Maven默认生成的构件,什么是额外配置生成分发包。如果能是dog-cli-1.0-dist.zip就最好了。这里的dist就是classifier,默认Maven只生成一个构件,我们称之为主构件,那当我们希望Maven生成其他附属构件的时候,就能用上classifier。常见的classifier还有如dog-cli-1.0-sources.jar表示源码包,dog-cli-1.0-javadoc.jar表示JavaDoc包等等。

classifier它表示在相同版本下针对不同的环境或者jdk使用的jar,如果配置了这个元素,则会将这个元素名在加在最后来查找相应的jar,例如:

<classifier>jdk17</classifier>
<classifier>jdk18</classifier>

import
仅可在<dependencyManagement标签中使用。等价于<parent。项目中往往会有自定义的<parent引用,对于框架的引用,例如spring-boot,可放在<dependencyManagement标签中使用。例如:

<scopeimport</scope解决单继承问题,类似parent标签,把spring-boot-dependencies引入到dependencyManagement -->

dependency中的type
<typepom</type把spring-boot-dependencies引入为pom 文件

<dependencyManagement>
		<dependencies>
			<dependency>
				<!-- Import dependency management from Spring Boot -->
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>1.5.8.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

等价于

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.8.RELEASE</version>
	</parent>

常用maven插件

maven插件自定义和使用

常用maven命令

添加链接描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值