Maven 相关整理

作者: 58bc06151329 | 来源:发表于2019-06-28 17:25 被阅读1次

    文前说明

    作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

    本文仅供学习交流使用,侵权必删。
    不用于商业目的,转载请注明出处。

    1. 概要

    • maven 是一款服务于 Java 平台的自动化构建工具。
    • 使用 maven 的优点在于。
      • 可以将一个项目拆分成多个工程。
      • 可以将 jar 包保存在 " 仓库 " 中,不管在哪个项目只要使用引用即可。
      • 可以使用统一的规范方式下载 jar 包。
      • 所有的 jar 包都放在 " 仓库 " 中,所有的项目都使用仓库的一份 jar 包。
      • 自动的将依赖的 jar 包导入。

    2. 原理

    2.1 安装

    • 检查当前系统是否配置 JAVA_HOME 环境变量。
    • 下载 maven,解压 maven 放置于一个非中文无空格的路径下。
    • 配置 maven 相关环境变量。
      • 在环境变量增加 M2_HOME,路径为 maven 解压后的根目录。
      • 在环境变量里的 path 中增加 <maven>/bin 的目录。
    • mvn -v 查看 maven 版本验证。
    [root@compiler3x noarch]# mvn -v
    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-25T03:49:05+08:00)
    Maven home: /root/software/apache-maven-3.5.3
    Java version: 1.7.0_181, vendor: Oracle Corporation
    Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.181-2.6.14.8.el7_5.x86_64/jre
    Default locale: en_US, platform encoding: UTF8
    OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"
    

    2.2 仓库与坐标

    • pom.xml(Project Object Model)项目对象模型
      • 是 maven 的核心配置文件,所有的构建配置都在此文件中设置。
      • 执行 maven 命令必须进入到 pom.xml 的目录中进行执行。
    • maven 工程必须按照约定的目录结构创建。
    .
    ├── pom.xml
    └── src
        └── main
            ├── java
            └── resources
        └── test
    

    仓库

    • 仓库可分为 本地仓库远程仓库
      • 本地仓库的默认位置是 ~/.m2/repository
      • 远程仓库
        • 可以搭建在局域网中,一般公司都会有私服,私服一般使用 nexus 搭建
        • 中央仓库架设在 Internet 上,像 springframework 就在中央仓库上。
    • 也可以通过 settings.xml 配置文件配置本地仓库的路径。
    <localRepository>/root/Java/repository</localRepository>
    

    坐标

    • 使用三个向量在仓库中唯一的定位一个 maven 工程。
      • groupId(组 ID)、artifactId(ID)、version(版本)
    • maven 坐标和仓库对应的映射关系
      • [groupId]/[artifactId]/[version]/[artifactId]-[version].jar
      • 例如:~/.m2/repository/commons-beanutils/commons-beanutils/1.9.3/commons-beanutils-1.9.3.jar

    2.3 依赖

    • maven 解析依赖信息时会先到本地仓库中取查找被依赖的 jar 包。
      • 如果本地仓库中没有的 jar 包,会到中央仓库中查找,获取后下载到本地仓库。
      • 中央仓库中也找不到依赖的 jar 包,则编译失败。
    • 如果依赖的是自己或者团队开发的 maven 工程,需要先使用 install 命令把被依赖的 mave n工程的 jar 包导入到本地仓库中。

    依赖范围

    • 在 POM 4 中,<dependency> 中引入了 <scope>,它主要管理依赖的部署。
    范围 说明
    compile 编译范围,默认值,如果没有提供一个范围,那依赖的范围就是编译范围。编译范围依赖在所有的 classpath 中可用,适用于所有阶段(开发、测试、部署、运行),jar 包会一直存在于所有阶段。
    provided 已提供范围,依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用。已提供范围的依赖在编译 classpath (不是运行时)可用。它们不是传递性的,也不会被打包。只在开发、测试阶段使用,目的在于不让 Servlet 容器和本地仓库的 jar 包冲突 。例如 servlet.jar。
    runtime 运行时范围,依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如在编译的时候只需要 JDBC api jar,而只有在运行的时候才需要 JDBC 驱动实现。
    test 测试范围,在一般的编译和运行时都不需要,只有在测试编译和测试运行阶段可用。不会随项目发布。
    system 系统范围,类似 provided,必须显式的提供一个对于本地系统中 jar 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。maven 不会在 Repository 中查找它。如果将一个依赖范围设置成系统范围,必须同时提供一个 systemPath 元素。

    依赖的传递性

    • pom.xml 文件配置好依赖关系后,必须首先 mvn install 后,依赖的 jar 包才能使用。
    • compile 范围 的依赖是不能传递的。
    依赖的传递性
    • 因为 MavenProject2 和 MavenProjectDemo 依赖 MavenProject1,因此可以直接使用 spring-core.jar 包。

    依赖版本的原则

    • 路径最短者优先原则。
      • MavenProjectDemo 路径最短依赖为 MavenProject2,因此 Log4j 版本为 1.2.7。
    路径最短者优先原则
    • 路径相同先声明优先原则。
      • MavenProjectDemo 的 pom.xml 文件中,先声明的依赖,就使用该版本。
    路径相同先声明优先原则

    统一管理依赖的版本

    • 为了统一管理版本号,可以使用 properties 标签,里面可以自定义版本的标签名。
      • 在使用的地方使用 ${自定义标签名}。

    2.4 生命周期

    • maven 有 三套 相互独立 的生命周期。
    • 构建的生命周期由阶段组成。
      • 每个生命周期都由一些不同的构建阶段组成。每个构建阶段都是生命周期的一个步骤。
      • 这些构建周期的各个步骤是用来顺序执行,以便完成生命周期。

    Clean Lifecycle

    • 在进行真正的构建之前进行一些清理工作。
    • Clean 生命周期一共包含了三个阶段。
    阶段 说明 插件的目标
    pre-clean 执行一些需要在 clean 之前完成的工作。
    clean 移除所有上一次构建生成的文件。 maven-clean-plugin:clean
    post-clean 执行一些需要在 clean 之后立刻完成的工作。
    <phases>
      <phase>pre-clean</phase>
      <phase>clean</phase>
      <phase>post-clean</phase>
    </phases>
    <default-phases>
      <clean>
        org.apache.maven.plugins:maven-clean-plugin:2.5:clean
      </clean>
    </default-phases>
    

    Default Lifecycle

    • 构建的核心部分,编译,测试,打包,部署等等。
    阶段 说明 插件的目标
    validate 验证,验证项目是否正确,并且所有必要的信息是否有效。
    initialize 初始化,初始化生成状态,例如设置属性或创建目录。
    generate-sources 生成源,生成任何要包含在编译中的源代码。
    process-sources 处理源代码,处理源代码,例如过滤任何值。
    generate-resources 生成资源,生成要包含在包中的资源。
    process-resources 复制并处理资源文件,至目标目录,准备打包。 maven-resources-plugin:resources
    compile 编译项目的源代码。 maven-compiler-plugin:compile
    process-classes 进程类,从编译后处理生成的文件,例如在 Java 类上做字节码增强。
    generate-test-sources 生成测试源,生成任何要包含在编译中的测试源代码。
    process-test-sources 处理测试源,处理测试源代码,例如过滤任何值。
    generate-test-resources 生成测试资源,为测试创建资源。
    process-test-resources 复制并处理资源文件,至目标测试目录。 maven-resources-plugin:testResources
    test-compile 编译测试源代码。 maven-compiler-plugin:testCompile
    process-test-classes 过程测试类,在测试编译后处理生成的文件,例如在 Java 类上做字节码增强。适用于 Maven 2.0.5 及以上。
    test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 maven-surefire-plugin:test
    prepare-package 准备包装,在实际包装之前,执行准备包装所需的任何操作。这通常会导致包的解包、处理版本。适用于 Maven 2.1 及以上。
    package 接受编译好的代码,打包成可发布的格式,如 jar。 maven-jar-plugin:jar
    pre-integration-test 预集成测试,在执行集成测试之前执行所需的操作。这可能涉及到诸如设置所需环境之类的事情。
    integration-test 集成测试,在可以运行集成测试的环境中处理和部署包(如果需要)。
    post-integration-test 集成后测试,执行集成测试后执行所需的操作。这可能包括清理环境。
    verify 运行集成测试,以确保项目符合质量标准。
    install 将包安装至本地仓库,用于让其它项目依赖。 maven-install-plugin:install
    deploy 将最终的包复制到远程的仓库,用以让其他开发人员与项目共享。 maven-deploy-plugin:deploy
    <phases>
      <phase>validate</phase>
      <phase>initialize</phase>
      <phase>generate-sources</phase>
      <phase>process-sources</phase>
      <phase>generate-resources</phase>
      <phase>process-resources</phase>
      <phase>compile</phase>
      <phase>process-classes</phase>
      <phase>generate-test-sources</phase>
      <phase>process-test-sources</phase>
      <phase>generate-test-resources</phase>
      <phase>process-test-resources</phase>
      <phase>test-compile</phase>
      <phase>process-test-classes</phase>
      <phase>test</phase>
      <phase>prepare-package</phase>
      <phase>package</phase>
      <phase>pre-integration-test</phase>
      <phase>integration-test</phase>
      <phase>post-integration-test</phase>
      <phase>verify</phase>
      <phase>install</phase>
      <phase>deploy</phase>
    </phases>
    
    • 不论需要执行该生命周期的哪一个阶段,maven 都会从这个生命周期的开始进行执行。

    Site Lifecycle

    • 生成项目报告,站点,发布站点。
    阶段 说明 插件的目标
    pre-site 执行一些需要在生成站点文档之前完成的工作。
    site 生成项目的站点文档。 maven-site-plugin:site
    post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
    site-deploy 将生成的站点文档部署到特定的服务器上。 maven-site-plugin:deploy
    <phases>
      <phase>pre-site</phase>
      <phase>site</phase>
      <phase>post-site</phase>
      <phase>site-deploy</phase>
    </phases>
    <default-phases>
      <site>
        org.apache.maven.plugins:maven-site-plugin:3.3:site
      </site>
      <site-deploy>
        org.apache.maven.plugins:maven-site-plugin:3.3:deploy
      </site-deploy>
    </default-phases>
    

    2.5 构建

    • 每个阶段都会有插件(plugin),插件的职责就是执行对应的命令。
    • 一个构建的过程是由很多的 插件的目标 组成(这些插件的目标可以属于不同的插件)。
      • 一个插件有可能有多个功能、每个功能就是一个目标。
        • 比如 maven-dependency-plugin 有十多个目标、每个目标对应了一个功能。插件的目标为 dependency:analyze、dependency:tree 和 dependency:list。
        • 通用写法、冒号前面是插件前缀、冒号后面是插件的目标。比如 compiler:compile。
        • maven 2.0.5 及之上版本,一个构建阶段的多个目标的执行顺序,是和这些目标在 pom 中声明的顺序一致的。但是,多个相同的插件是不允许的。
        • maven 2.0.11 及以上版本,要是定义了多个相同插件,它们会被分组并且一起执行。
      • 如果一个构建阶段没有目标绑定,那么这个构建阶段就不会执行。但是一旦有一个或者多个目标绑定,它就会执行这些目标。
        • clean 和 package 是 构建过程,dependency:copy-dependencies 是一个 插件的目标
    • 一个插件的目标可以被绑定在零个或者多个构建过程上。
      • 没有被绑定在任何构建过程的目标也可以被直接调用。
      • 如果一个目标绑定在一个或者多个构建阶段,这个目标会被所有构建阶段调用。
    • 一些由复合词(pre-, post-, process-*)组成的构建阶段通常不会由命令行直接调用。这些构建过程连接整个构建流程,产生不被外部使用的中间结果。例如故障保护和代码覆盖插件绑定目标在 integration-test 和 verify 阶段。最终的结果就是在 verify 阶段之后生成可用的测试和代码覆盖率报告。
      • 如果 integration-test 由命令行调用,就不会生成任何的报告。
      • 整个环境会停留在悬挂状态,maven 不会自己终止。
    生命周期与插件的绑定关系
    • 构建过程 1 由目标 A1 组成。
    • 构建过程 2 由目标 A2 和 B1 组成。
    • 目标 B2 可以被直接调用。
    • 构建过程 n 不会执行。

    2.5.1 Packaging 的内置生命周期绑定目标

    • 通过 pom 中的元素可以为项目设置打包方式。
      • 可用的打包值为 ejb、ejb3、jar、par、rar 、war、pom、ear、maven-plugin。
      • 如果没有设置 packaging 的值,默认为 jar。
      • 依赖 packaging 值不同有不同的目标,每种 packaging 会由一些特定的目标绑定在特定的任务中。

    ejb / ejb3 / jar / par / rar / war

    阶段 插件的目标
    process-resources resources:resources
    compile compiler:compile
    process-test-resources resources:testResources
    test-compile compiler:testCompile
    test surefire:test
    package ejb:ejb / ejb3:ejb3 / jar:jar / par:par / rar:rar / war:war
    install install:install
    deploy deploy:deploy
    <phases>
      <process-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:resources
      </process-resources>
      <compile>
        org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
      </compile>
      <process-test-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
      </process-test-resources>
      <test-compile>
        org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
      </test-compile>
      <test>
        org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
      </test>
      <package>
        org.apache.maven.plugins:maven-jar-plugin:2.4:jar
      </package>
      <install>
        org.apache.maven.plugins:maven-install-plugin:2.4:install
      </install>
      <deploy>
        org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
      </deploy>
    </phases>
    

    pom(纯元项目的打包方式)

    阶段 插件的目标
    package site:attath-descriptor
    install install:install
    deploy deploy:deploy
    <phases>
      <install>
        org.apache.maven.plugins:maven-install-plugin:2.4:install
      </install>
      <deploy>
        org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
      </deploy>
    </phases>
    

    ear

    阶段 插件的目标
    generate-resources ear:generate-application-xml
    process-resources resources:resources
    package ear:ear
    install install:install
    deploy deploy:deploy
    <phases>
      <generate-resources>
        org.apache.maven.plugins:maven-ear-plugin:2.8:generate-application-xml
      </generate-resources>
      <process-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:resources
      </process-resources>
      <package>
        org.apache.maven.plugins:maven-ear-plugin:2.8:ear
      </package>
      <install>
        org.apache.maven.plugins:maven-install-plugin:2.4:install
      </install>
      <deploy>
        org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
      </deploy>
    </phases>
    

    maven-plugin

    阶段 插件的目标
    generate-resources plugin:descriptor
    process-resources resources:resources
    compile compiler:compile
    process-test-resources resources:testResources
    test-compile compiler:testCompile
    test surefire:test
    package jar:jar and plugin:addPluginArtifactMetadata
    install install:install
    deploy deploy:deploy
    <phases>
      <process-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:resources
      </process-resources>
      <compile>
        org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
      </compile>
      <process-classes>
        org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor
      </process-classes>
      <process-test-resources>
        org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
      </process-test-resources>
      <test-compile>
        org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
      </test-compile>
      <test>
        org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
      </test>
      <package>
        org.apache.maven.plugins:maven-jar-plugin:2.4:jar,
        org.apache.maven.plugins:maven-plugin-plugin:3.2:addPluginArtifactMetadata
      </package>
      <install>
        org.apache.maven.plugins:maven-install-plugin:2.4:install
      </install>
      <deploy>
        org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
      </deploy>
    </phases>
    
    • 完整的 maven 生命周期是在 maven-core 模块的 components.xml 文件中定义,相关查看 文档
      • maven 2.x 中,默认的生命周期绑定的目标描述是在 components.xml。
      • maven 3.x 中,单独的 default-bindings.xml 文件中配置。

    2.6 Plugin

    • 把目标增加到构建阶段的方法是在项目中配置插件,插件就是提供目标给 maven 项目。
    • 而自定义绑定允许自己掌控插件目标与生命周期的结合。
    ...
     <plugin>
       <groupId>org.codehaus.modello</groupId>
       <artifactId>modello-maven-plugin</artifactId>
       <version>1.8.1</version>
       <executions>
         <execution>
           <configuration>
             <models>
               <model>src/main/mdo/maven.mdo</model>
             </models>
             <version>4.0.0</version>
           </configuration>
           <goals>
             <goal>java</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    ...
    
    • modello 插件会将 modello:java 目标绑定到 generate-source 阶段(modello:java 目标会生成 java 代码)。所以使用 modello 插件并且让它生成代码并且将代码加入到 build 阶段。
    • 每个 excuteion 可以配置一个唯一的 ID,在继承或者应用权限阶段,可以控制是否合并目标配置文件,还是作为一个额外的执行,这样就可以根据不同的配置文件执行多次相同的目标。
      • 当多个 executions 被配置给一个单独的过程,会按照 pom 中配置的顺序执行。

    2.6.1 插件配置

    • 几乎所有 maven 插件的目标都有一些可配置的参数,可以通过命令行和 pom 配置等方式来配置这些参数。

    命令行插件配置

    • 很多插件目标的参数都支持从命令行配置,用户可以在 maven 命令中使用 -D 参数,并伴随一个 <参数键 = 参数值> 的形式,来配置插件目标的参数。
    • 例如 maven-surefire-plugin 提供 maven.test.skip 参数,当其值为 true 时,跳过执行测试。
    [root@localhost ~]# mvn install -Dmaven.test.skip=true
    
    • 参数 -D 是 Java 自带的,其功能是通过命令行设置一个 Java 系统属性,maven 简单的重用了该参数,在准备插件的时候检查系统属性,便实现了插件参数的配置。

    pom 中插件全局配置

    • 并不是所有的插件参数都适合从命令行配置,有些参数的值从项目创建到项目发布都不会改变,或者说很少改变,对于这种情况,在 pom 文件中一次性配置更方便。
    • 例如,需要配置 maven-compiler-plugin 告诉其编译 Java 1.5 版本的源文件,生成与 Java 虚拟机 1.5 兼容的字节码文件。
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    • 这样,不管绑定到 compile 阶段的 maven-compiler-plugin:compile 任务,还是绑定到 test-compiler 阶段的 maven-compiler-plugin:testCompiler 任务,就都能够使用该配置。

    pom 中插件任务配置

    • 也可以为某个插件配置特定的参数。
    • 以 maven-antrun-plugin 为例,它有一个目标 run,可以用来在 maven 中调用 Ant 任务。用户将 maven-antrun-plugin:run 绑定到多个生命周期阶段上,再加上不同的配置,可以让 maven 在不同的生命阶段执行不同的任务。
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <id>ant-validate</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>I'm bound to validate phase.</echo>
                            </tasks>
                        </configuration>
                    </execution>
                    <execution>
                        <id>ant-verify</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>I'm bound to verify phase.</echo>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    
    • 上述插件配置绑定到了 validate 和 verify 阶段。

    • 局部配置的 <configuration> 标签(tag)放在 <execution> 标签(tag)里边,而全局配置的 <configuration> 标签(tag)则放在 <plugin> 标签(tag)里边,因为全局配置里根本就没有 <execution> 标签(tag),因为全局配置针对的是该插件的全部目标(goal)配置的。

    2.6.2 常用插件

    编译插件

    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-compiler-plugin</artifactId>  
        <configuration>  
            <source>1.6</source>  
            <target>1.6</target>  
            <encoding>${project.build.sourceEncoding}</encoding>  
        </configuration>  
    </plugin>  
    
    参数 说明
    source 源代码编译版本。
    target 目标平台编译版本。
    encoding 字符集编码。

    设置资源文件的编码方式

    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-resources-plugin</artifactId>  
        <version>2.4.3</version>  
        <executions>  
            <execution>  
                <phase>compile</phase>  
            </execution>  
        </executions>  
        <configuration>  
            <encoding>${project.build.sourceEncoding}</encoding>  
        </configuration>  
    </plugin> 
    
    参数 说明
    phase 绑定到 compile 阶段。
    encoding 设置编码方式。

    自动拷贝 jar 包到 target 目录

    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-dependency-plugin</artifactId>  
        <version>2.6</version>  
        <executions>  
            <execution>  
                <id>copy-dependencies</id>  
                <phase>compile</phase>  
                <goals>  
                    <goal>copy-dependencies</goal>  
                </goals>  
                <configuration>  
                    <!-- ${project.build.directory}为 maven 内置变量,缺省为 target -->  
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                    <excludeTransitive>false</excludeTransitive>  
                    <stripVersion>true</stripVersion>  
                </configuration>  
            </execution>  
        </executions>  
    </plugin>  
    
    参数 说明
    outputDirectory target 目录。
    excludeTransitive 表示是否不包含间接依赖的包。
    stripVersion 表示复制的 jar 文件去掉版本信息。
    • 在部署 war 包时,需要将项目依赖的 jar 包,也打到 war 包中,因此会用到上述插件。

    生成源代码 jar 包

    <plugin>  
        <artifactId>maven-source-plugin</artifactId>  
        <version>2.1</version>  
        <configuration>  
            <!-- <finalName>${project.build.name}</finalName> -->  
            <attach>true</attach>  
            <encoding>${project.build.sourceEncoding}</encoding>  
        </configuration>  
        <executions>  
            <execution>  
                <phase>compile</phase>  
                <goals>  
                    <goal>jar</goal>  
                </goals>  
            </execution>  
        </executions>  
    </plugin>  
    
    参数 说明
    phase 绑定到 compile 阶段。
    attach 指定是否将项目附加到项目。
    encoding 设置编码方式。

    将项目打成 jar 包

    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-jar-plugin</artifactId>  
        <version>2.4</version>  
        <configuration>  
            <archive>  
                <manifest>  
                    <addClasspath>true</addClasspath>  
                    <classpathPrefix>lib/</classpathPrefix>  
                    <!-- 当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名 -->  
                    <mainClass>com.demo.test.Test</mainClass>  
                </manifest>  
            </archive>  
        </configuration>  
    </plugin> 
    
    参数 说明
    addClasspath 告知 maven-jar-plugin 添加一个 Class-Path 元素到 MANIFEST.MF 文件,以及在 Class-Path 元素中包括所有依赖项 。
    classpathPrefix 所有的依赖项应该位于 lib 文件夹。
    mainClass 当用户使用 lib 命令执行 jar 文件时,使用该元素定义将要执行的类名。
    • 将项目打成 jar 包时,有时会需要将项目打成可以直接运行的 jar 包,因此就需要将项目依赖的 jar 包也打入 jar 包中。

    将项目打成 war 包

    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-war-plugin</artifactId>  
        <version>2.1.1</version>  
        <configuration>  
            <!-- <warName>${project.build.name}</warName> -->  
        </configuration>  
    </plugin> 
    
    参数 说明
    encoding 强制字符集编码。
    warName war 包名称。
    webappDirectory 产生 war 前,用于存放构建 war 包的目录。

    打包时清空一些指定目录

    <plugin>  
        <artifactId>maven-clean-plugin</artifactId>  
        <configuration>  
            <verbose>true</verbose>  
            <filesets>  
                <fileset>  
                    <directory>c:/test</directory>  
                </fileset>  
          </filesets>  
        </configuration>  
    </plugin>  
    

    插件检查不通过,人为忽略

    <pluginManagement>  
        <plugins>  
            <plugin>  
                <groupId>org.eclipse.m2e</groupId>  
                <artifactId>lifecycle-mapping</artifactId>  
                <version>1.0.0</version>  
                <configuration>  
                    <lifecycleMappingMetadata>  
                        <pluginExecutions>  
                            <!-- 忽略 2.0 以上版本的 maven-dependency-plugin 的检查 -->  
                            <pluginExecution>  
                                <pluginExecutionFilter>  
                                    <groupId>org.apache.maven.plugins</groupId>  
                                    <artifactId>maven-dependency-plugin</artifactId>  
                                    <versionRange>[2.0,)</versionRange>  
                                    <goals>  
                                        <goal>copy-dependencies</goal>  
                                    </goals>  
                                </pluginExecutionFilter>  
                                <action>  
                                    <ignore />  
                                </action>  
                            </pluginExecution>  
                        </pluginExecutions>  
                    </lifecycleMappingMetadata>  
                </configuration>  
            </plugin>  
        </plugins>  
    </pluginManagement>  
    

    参考资料

    https://www.cnblogs.com/yjf512/p/7449728.html
    https://blog.csdn.net/zhaojianting/article/details/80321488

    相关文章

      网友评论

        本文标题:Maven 相关整理

        本文链接:https://www.haomeiwen.com/subject/nhqxcctx.html