Maven知识点
一、常用标签及属性#
1. maven 依赖属性:groupId、artifactId、version#
groupId、artifactId、version,当使用该插件时会从本地仓库中搜索,如果没有即从远程仓库下载
2.插件执行: execution,id ,phase,goals,configuration#
execution 配置包含一组指示插件如何执行的属性:
id : 执行器命名
phase:在什么阶段执行
phase执行是有顺序的,如果执行mvn verify,则会顺序执行validate,compile,test和package。
- validate – 用来验证项目是否正确或者项目所需要的信息是否可用。
- compile – 用来编译项目代码
- test – 执行代码中的单元测试
- package – 将编译后的代码进行打包,打包可有很多种方式,比如:jar,war等
- verify – 执行集成测试
- install – 将项目安装到本地仓库中,供有依赖关系的其他项目使用
- deploy – 将项目部署到远程仓库,以便共享给其他的用户
goals:执行一组什么目标或功能,定义在maven中的plugin中的,可以包含在Phases里面执行,也可以单独用命令执行。
configuration:执行目标所需的配置文件
3.聚合: <modules>#
指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用
4.可选依赖:<optional>#
可选依赖表示这个依赖不是必须的。
5.排除依赖:<exclusions>#
即排除指定的间接依赖。通过配置 <exclusions> 配置排除指定组件
6.依赖范围 : <scope>, <systemPath>#
像junit 这个组件我们只有在运行测试用例的时候去要用到,这就没有必要在打包的时候把junit.jar包过构建进去,可以通过Mave的依赖范围配置<scope>来达到这种目的。maven总共支持以下四种依赖范围:
compile(默认): 编译范围,编译和打包都会依赖。
provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar
runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar
test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar
system:表示由系统中CLASSPATH指定。编译时依赖,不会打包进去。配合<systemPath> 一起使用。
注:system除了可以用于引入系统classpath中包,也可以用于引入系统非maven收录的第三方Jar,做法是将第三方Jar放置在项目的 lib 目录下,然后配置相对路径,但因system不会打包进去所以需要配合maven-dependency-plugin插件配合使用。
7.依赖管理:<dependencyManagement> #
通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一至,这时就可以在父工程中加入
通过 <dependencyManagement> 可实现在在外面的父pom 中统一管理所有依赖的版本。
<!-- 父工程中声明 junit 4.12 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </dependencyManagement> <!-- 子工程中引入 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
8.项目属性: <properties>#
9.maven 依赖引用属性:type#
maven引入依赖,默认使用的type属性为 jar 类型。当需要引用很多依赖并进行统一管理时,则需要在dependencyManagement中声明引用的依赖版本。maven提供了引用类型type为pom类型的依赖,这种依赖可以直接使用该依赖中声明的所有jar的依赖管理。如spring-boot,spring-cloud都提供了这样的依赖支持:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子pom使用父pom依赖,则可以直接使用,因为其在上面的pom内部已经声明了引用的版本等信息:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
10.maven 默认的属性#
${basedir} 项目根目录
${version} 表示项目版本;
${project.basedir} 同${basedir};
${project.version} 表示项目版本,与${version}相同;
${project.build.directory} 构建目录,缺省为target
${project.build.sourceEncoding} 表示主源码的编码格式;
${project.build.sourceDirectory} 表示主源码路径;
${project.build.finalName} 表示输出文件名称;
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
二、常用的maven plugin打包插件:maven-dependency-plugin和maven-jar-plugin。#
maven-dependency-plugin:#
maven-dependency-plugin是处理与依赖相关的插件。它有很多可用的goal,大部分是和依赖构建、分析和解决相关的goal,这部分goal可以直接用maven的命令操作
,
例如:mvn dependency:tree、mvn dependency:analyze
maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze可以告诉你项目依赖潜在的问题,如果你有直接使用到的却未声明的依赖,该目标就会发出警告。
copy-dependencies: 这种模式会把外部依赖的jar包都独立生成到target/下面,运行时候手动指定-classpath;
<!--在打包阶段将依赖的jar包导出到lib目录下-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<!--outputDirectory: 项目构件输出目录,其中${project.build.directory}默认为target/-->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
goals是和相应的phase相关联的,在上面的例子中,我们将copy-dependencies和package相关联,则在我们执行mvn package的时候就会自动执行copy-dependencies,从配置文件可以知道,我们将会把项目的依赖jar包拷贝到项目的build目录的lib目录下。
maven-jar-plugin:#
默认的打包方式,用来打普通的project JAR
包
有了依赖的lib,可以将main程序打包成为一个可执行的jar包。这时候我们就需要使用到maven-jar-plugin。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<!--要使用的打包配置.-->
<archive>
<!-- 创建的归档文件是否包含以下pom.xml 和pom.properties Maven 文件,默认是true -->
<addMavenDescriptor>true</addMavenDescriptor>
<!-- 生成MANIFEST.MF的设置 -->
<manifest>
<!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
<addClasspath>true</addClasspath>
<!-- 这个jar所依赖的jar包添加classPath的时候的前缀,如果这个jar本身和依赖包在同一级目录,则不需要添加 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar启动入口类 -->
<mainClass>com.example.demo.DemoApplication</mainClass>
</manifest>
<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径 -->
<!--<Class-Path>../config/</Class-Path>-->
</manifestEntries>
</archive>
<!-- jar包的位置,其中${project.build.directory}默认为 target/ -->
<outputDirectory>${project.build.directory}</outputDirectory>
<!--过滤掉不希望包含在jar中的文件-->
<excludes>
<exclude>${project.basedir}/xml/*</exclude>
</excludes>
<!--要包含的文件列表-->
<includes>
<!-- 打jar包时,打包class文件和config目录下面的 properties文件 -->
<!-- 有时候可能需要一些其他文件,这边可以配置,包括剔除的文件等等 -->
<include>**/*.class</include>
<include>**/*.properties</include>
</includes>
</configuration>
</plugin>
为了生成可执行的jar包,我们需要在MANIFEST.MF文件中添加mainClass文件的路径,这样在执行jar包的时候,无需额外的参数即可运行。
遗憾的是,如果我们的class文件用到了外部jar包的依赖时候,jar包直接运行会出错,因为找不到所依赖的jar包。
引用:https://blog.51cto.com/u_15535797/6076316#
https://blog.csdn.net/weixin_35044595/article/details/112245164#
<!--outputDirectory: 项目构件输出目录,其中${project.build.directory}默认为target/-->
作者:Billd
出处:https://www.cnblogs.com/Billd/p/17471678.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律