Loading

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 国际」许可协议进行许可。

posted @   Billd  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu