[这大概是最好的Spring教程!]Maven打包项目的精准指定——流程管理 ...

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

作用

        Maven不但可以进行依靠管理的自动化,还可以自动化实现编译,打包,发布,等,也被成为构建流程
生命周期(lifecycle)

构成

        Maven生命周期本身可以看做一个集合,在这个集合中包含了一系列阶段(phase)。也就是说Maven的生命周期由一系列阶段(phase)构成
        但是话又说回来phase又是什么,Maven把打包的项目分为了很多个阶段,这个阶段就直接用了phase来表示,因为我们的需求是不同的,所以整个项目应该被打包到怎么个水平也是不同的,一个很形象的例子就是好比C语言的编译过程一样
C语言的编译有下面四个过程:

  • 预处理
  • 编译
  • 汇编
  • 链接
        Maven的打包阶段就像这几个过程一样,我们可以指定打包到那种水平,就像C语言我们让他编译到哪个水平,好比我们要编译到汇编的这个过程,不必要链接。如许就像我们运行mvn package,整个打包就会打包到package的水平。C语言编译的这四个过程就就如phase一样。
default生命周期

        这里我们可以来看下最常用的default周期是怎么样的
阶段名称描述validate验证项目是否精确,所有必要的信息是否可用。initialize初始化构建环境,例如设置属性。generate-sources生成任何须须的源代码。process-sources处理源代码,例如过滤源代码中的值。generate-resources生成资源文件,如设置文件等。process-resources复制和处理资源到目标目次,准备打包。compile编译项目的源代码。process-classes处理编译生成的文件,例如字节码加强。generate-test-sources生成测试源代码。process-test-sources处理测试源代码。generate-test-resources生成测试资源文件。process-test-resources复制和处理测试资源到测试目标目次。test-compile编译测试源代码。process-test-classes处理测试编译生成的文件。test运行测试。prepare-package为打包阶段做准备。package把编译的代码和资源打包成可分发的格式,如JAR、WAR等。pre-integration-test在集成测试执行前准备环境。integration-test处理和部署项目到可以运行集成测试的环境。post-integration-test在集成测试执行后清理环境。verify运行任何检查,验证包是否有效。install安装包到本地仓库,以便其他项目可以作为依靠项使用。deploy将最终的包复制到远程仓库,供其他开发者和项目使用。        如果我们运行mvn package,Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止
        如果我们运行mvn compile,Maven也会执行default生命周期,但这次它只会运行到compile
clean生命周期

        当然我们不止default周期,还有很多周期,这里还介绍一下clean周期

  • pre-clean - 这是 clean 生命周期的第一个阶段,用于执行任何在真正清理之前必要完成的工作。这个阶段可以用来做一些准备工作,好比备份文件或者检查是否有足够的权限来执行清理操作。
  • clean - 这个阶段是 clean 生命周期的焦点,它负责实际的清理工作。在这个阶段,Maven 会删除之前构建过程中生成的所有文件,例如编译生成的 .class 文件、测试结果、打包生成的 JAR 或 WAR 文件等。目的是清除所有构建产物,以便下一次构建时能从干净的状态开始。
  • post-clean - 这是 clean 生命周期的最后一个阶段,用于执行清理之后必要完成的任务。这个阶段可以用来进行一些清理后的收尾工作,好比删除暂时文件或者发送清理完成的关照。
        更复杂的例子是指定多个phase,例如,运行mvn clean package,Maven先执行clean生命周期并运行到clean这个phase,然后执行default生命周期并运行到package这个phase,实际执行的phase如下:

  • pre-clean
  • clean (注意这个clean是phase)
  • validate (开始执行default生命周期的第一个phase)
  • initialize
  • ...
  • prepare-package
  • package
在实际开发过程中,经常使用的命令有:
mvn clean:清理所有生成的class和jar;
mvn clean compile:先清理,再执行到compile;
mvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile;
mvn clean package:先清理,再执行到package。
phase绑定的操作:goal

        每一个phase都有一个操作,但是这不代表说是phase在操作,而是里面包含的一个goal在操作,phase的下边可以绑定很多的goal,如许就使得phase能按照我们本身的想法来DIY phase的操作。如许也就是说phase着实也就是一个包含了goal的集合。
这个时候我们着实就能有一个具体的框架了

  • Maven的流程框架中包含了很多个lifecycle
  • 每一个的lifecycle都包含了很多个phase
  • 每一个phase中又包含了很多个goal
  • 最后goal包含的就是操作的代码
自定义插件

        我们前面说到,phase绑定的操作着实是在goal中的,很多时候自带的phase是无法满足我们的需求的,这个时候我们就必要能自定义goal,这个就是自定义插件解决的问题
自定义插件的设置

        一般来说,如许一个goal的设置是在pom.xml去设置的,这个文件都在你项目之中的

1. 引入插件 (maven-shade-plugin)

        在 Maven 中,我们可以通过  标签来添加插件,这种插件声明告诉 Maven,我们在构建过程中必要一些标准操作以外的额外处理。
        如,maven-shade-plugin 是一个非标准插件,主要作用是将项目的所有依靠和源代码打包成一个“胖 jar”(fat jar)。这种 jar 文件包含项目的所有依靠,可以在任何支持 Java 的体系上直接运行。
  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>org.apache.maven.plugins</groupId>
  5.             <artifactId>maven-shade-plugin</artifactId>
  6.             <version>3.2.1</version>
  7.             
  8.         </plugin>
  9.     </plugins>
  10. </build>
复制代码
2. 设置插件的执行阶段和目标 ()

         这个标签就定义了在哪个phase中实现我们的操作。每个阶段对应一组任务,好比 clean、compile、test、package、install 等。package 阶段是将项目打包成 jar 文件的阶段。

  • 执行阶段 (phase) :我们将插件的执行阶段设定为 package,如许当执行 mvn package 命令时,Maven 会在打包阶段运行 maven-shade-plugin。
  • 执行目标 (goals) :shade 指定了这个插件在 package 阶段的主要任务是将所有依靠打包进 jar 文件中。shade 是 maven-shade-plugin 的一个默认目标,用于合并依靠项并生成胖 jar。
  1. <executions>
  2.     <execution>
  3.         <phase>package</phase>
  4.         <goals>
  5.             <goal>shade</goal>
  6.         </goals>
  7.     </execution>
  8. </executions>
复制代码
3. 设置插件 ()

        大部门自定义插件必要额外的设置项。maven-shade-plugin 的设置项主要用于指定打包时的行为。下面是该插件常见的几个设置项:
(a) :用于修改 jar 文件的内容,尤其是资源文件的合并和 manifest 文件的设置。

        在 jar 文件中,Manifest.mf 文件存放着关于 jar 文件的元数据信息,好比版本号、开发者信息等。在可执行 jar 文件中,Manifest.mf 的 Main-Class 字段决定了该 jar 的入口类(main)。设置 maven-shade-plugin 的  标签,并使用 ManifestResourceTransformer,可以指定 jar 的主类。
(b) :指定主类

         用于定义应用程序启动时所使用的主类。即当使用 java -jar your-app.jar 启动 jar 文件时,JVM 会从  指定的类中寻找 public static void main(String[] args) 方法作为入口。
  1. <configuration>
  2.     <transformers>
  3.         <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  4.             <mainClass>com.itranswarp.learnjava.Main</mainClass>
  5.         </transformer>
  6.     </transformers>
  7. </configuration>
复制代码
将这些元素组合在一起,我们得到了一个完整的 maven-shade-plugin 设置示例:
  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>org.apache.maven.plugins</groupId>
  5.             <artifactId>maven-shade-plugin</artifactId>
  6.             <version>3.2.1</version>
  7.             
  8.         </plugin>
  9.     </plugins>
  10. </build>                        package                                             shade                                                                                                     <configuration>
  11.     <transformers>
  12.         <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  13.             <mainClass>com.itranswarp.learnjava.Main</mainClass>
  14.         </transformer>
  15.     </transformers>
  16. </configuration>                                                                                                   
复制代码
        注意,Maven自带的标准插件例如compiler是无需声明的,只有引入其它的插件才必要声明。
下面枚举了一些常用的插件:

  • maven-shade-plugin:打包所有依靠包并生成可执行jar;
  • cobertura-maven-plugin:生成单元测试覆盖率报告;
  • findbugs-maven-plugin:对Java源码进行静态分析以找出潜在问题。
本身实践使用maven-shade-plugin创建可执行jar遇到的问题日记

build的位置

        注意整个标签是放在里面就行
的定名

        org.apache.maven.plugins这个id是maven官方的插件所以我们不用改
Main的路径
  1. <transformers>
  2.   <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  3.   <mainClass>com.example.Main</mainClass>
  4.   </transformer>
  5. </transformers>
复制代码
        每个人的main函数都不一样,但是只要指定对main函数的类就行
        如果这段代码有错的话你执行可执行文件会报错:.jar中没有主清单属性
使用mvn 指令后可执行文件的位置

        我在项目的根目次执行完mvn clean package后,整个输出都会在根目次下的target文件中,直接执行.jar文件就行
这大概是最好的Spring教程!

感谢您看到这里  这大概是最好的Spring教程系列  更多的文章可以到这查看这大概是最好的Spring教程!即便无基础也能看懂的入门Spring,仍在连续更新。,我还在荔枝更新出最详细的Spring教程

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表