1、需求
项目上一致是使用的mvn 进行打包, 对于项目上的一些mvn 命令,有时候会忘记,所以将mvn 汇总起来
2、命令汇总
① mvn clean
将项目目录下的编译的文件清除掉,即target 文件夹的编译文件
② mvn complie
编译项目的代码,生成class 文件到target文件夹下
③ mvn test
对项目进行运行测试
④ mvn package
打包文件并存放到项目的target 目录下,打包好的文件通常都是编译后的class 文件
⑤ mvn install
在本地仓库生成仓库的安装包, 可供其他项目引用,同时打包后的文件放到项目的target 目录下。
⑥ mvn deploy
完成了项目编译、单元测试 、打包功能,把打好的可执行jar包(war 包或者其他形式的包) 部署到本地maven 仓库,同时部署到maven 私服仓库
maven --- 依赖管理系统
通过maven 的依赖管理对项目所依赖的jar 进行统一管理,比如: 项目依赖 junit4.9, 通过在pom.xml 中定义junit 4.9 的依赖即使用junit 4.9 ,如下所示是junit 4.9 的依赖定义
<!--依赖关系 -->
<dependencies><!-- 此项目运行使用junit ,所以此项目依赖 junit --><dependency><!-- junit 的项目名称 --><groupId> junit</groupId><!-- junit 的模块名称 --><artifactId>junit</artifactId><!-- junit 版本 --><version>4.9</version><!-- 依赖范围:单元测试使用 junit --><scope>test</scope></dependency>
</dependencies>
3、拓展
① 如何快速定位到所依赖的包的依赖的关系
答: 这里通过 maven Hepler 来 排查对应的包依赖
即 先在 插件市场中安装对应的依赖 maven Hepler
定位到项目所在的 pom 文件中,然后打开底部的 Dependency Analyzer
然后查询图中的说明就可以找到对应的依赖
② maven中的pom 依赖中的build 是干啥的?
答:
resource
配置各个资源在maven 项目中的具体路径,用于包含或者排查某些资源文件,标签resource 包含一下元素
标签 | 类型 | 描述 |
targetPath | String | 指定build后的resource 存放的文件夹,默认是basedir,通常被打包在jar 中的resource 的目标路径 META-INF |
filtering | String | 表示为这个resource,filter是否激活,默认为false |
directory | String | 资源文件源路径,默认位于${basedir}/src/main/resources/目录下 |
include | List<String> | 一组文件名的匹配模式,被匹配的资源文件将构建过程处理 |
excludes | List<String> | 一组文件名的匹配模式,被匹配的资源文件将被构建过程忽略 |
<build><filters><filter>filters/filter1.properties</filter></filters><resources><resource><targetPath>META-INF/plexus</targetPath><filtering>true</filtering><directory>${basedir}/src/main/plexus</directory><includes><include>configuration.xml</include></includes><excludes><exclude>**/*.properties</exclude></excludes></resource></resources></build>
plugin
设置构建过程中需要的插件,标签plugin 包含以下元素
execution
execution 元素包含了插件执行需要的信息
configuration
不管是plugin 还是execution 都有元素configuration,该标签包含的元素和插件执行目标相关,为插件执行目标提供自定义传参,所以configuration 内元素各不相同,和执行目标提供的对外参数相关。
<?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">...<build><plugins><!-- 使用spring-boot-maven-plugin打包独立可执行程序 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.4.2.RELEASE</version><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions><configuration><finalName>milkyway-pc</finalName><classifier>1.0-SNAPSHOT</classifier><outputDirectory>../target</outputDirectory></configuration></plugin></plugins></build>
</project>
上述使用了maven 常用插件 spring-boot-maven-plugin ,使用该插件的默认goal: repackage(使用标签executions) ,该goal 会在mvn package 之后,再次打包可执行的jar/war ,并将mvn package 生成的软件包重名为 *.original。 使用标签configuration 为插件 spring-boot-maven-plugin 传参,配置最终生成的jar包,注: 该configuration 内的元素可以参考插件spring-boot-maven-plugin 提供了哪些对外配置的参数
③ dependencyManagement 是干啥用的,它与dependencies 区别
如果dependencies 里的dependency 自己没有声明version 元素,那么maven 就会到dependencyManagement 里面去找有没有对该artifactId 和groupId 进行版本生命,如果有,就继承它,如果没有就会报错,告诉你必须为dependency 生命一个version
如果dependencies 中的denpendency 声明了version, 那么无论dependencyManagement 中有无该jar的version生命,都已dependency 里的version为准。
答: (1) dependencies 及时在子项目中不写该依赖,那么子项目仍然会从父项目中继承该依赖项(全部继承)
(2) dependencyManagemeent里只是声明依赖,并不实现引入
(3) 因此子项目需要显示的声明需要用到的依赖,如果不在子项目中声明依赖,是不会从父项目中继承下来的,只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项。并且version和scope 都读取父pom, 另外如果子项目中指定了版本号,那么会使用子项目中指定jar版本
(简单来说就说,父级dependencyManagemeent 只是定义了版本,并不引入。)
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.0</version> </dependency> </dependencies>
</dependencyManagement>
会实际下载的jar包:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.0</version> </dependency>
</dependencies>
④ plugins 和pluginManagement 的区别
pluginsManagement 是表示插件生命,即你在项目中的pluginManagement下声明了插件,Maven 不会加载该插件,pluginManagement 声明可以被继承。
pluginManagement 一般是用在父 pom中定义,提供给子pom 使用,子pom也可以覆盖这个定义,而且你在父pom中定义了版本之后,子模板直接应用groupId 和 artifactId ,而不指定版本。
plugins就是直接引入一个plugin,而且可以绑定到maven 相关的声明周期上
pluginManagement 主要是为了统一管理插件,确保所有子pom使用的插件版本保持一致。
<pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.1</version><configuration><attach>true</attach></configuration><executions><execution><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins>
</pluginManagement>
子pom
<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId></plugin>
</plugins>