添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Maven是Java中较为重要的项目构建工具,它跟npm工具一样都是依赖的管理工具。同时,它还包含了打包,编译,测试,发布等功能的像webpack的工具。

Maven是相比Java的Ant更为好用的工作,主要改进是:

  • 约定方式定义目录,所有的Maven工程,src与test目录都是相同雷同的,约定方式的定义避免配置的麻烦。
  • 约定方式定义打包流程,Maven工具定义了多个phrase
  • validate: validate the project is correct and all necessary information is available
  • compile: compile the source code of the project
  • test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
  • package: take the compiled code and package it in its distributable format, such as a JAR.
  • integration-test: process and deploy the package if necessary into an environment where integration tests can be run
  • verify: run any checks to verify the package is valid and meets quality criteria
  • install: install the package into the local repository, for use as a dependency in other projects locally
  • deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
  • Maven的打包流程是固定的,不能被改变的,我们要配置的是不同的打包阶段(phrase),应该调用什么样的插件。而不是去配置哪个命令完成之后执行哪个命令,这大大简化了配置的难度。在之前的Ant工具,Makefile工具,npm工具中我们都是定义命令的执行流程,而不是定义阶段的需要插件是什么。

  • 约定方式的Super Pom,每个配置文件都有一个父级的配置文件,即使当前配置文件是空的,它也有每个phrase阶段默认绑定的插件是什么,这为零配置的配置文件做好了基础。
  • 最后是,Maven的其他功能包括:

  • 脚手架生成,根据脚手架生成Maven项目
  • 插件绑定phrase,为不同的phrase绑定不同的插件
  • filter source,为资源文件注入变量
  • 条件配置,根据不同的环境配置使用不同的配置文件
  • 依赖查找,依赖分析,查找,选择与安装。Java与node的依赖不同的是,同一个包在一个项目中只能有一个版本,不允许同一个包的多版本共存,这涉及到依赖包该如何抉择的问题。
  • 仓库,依赖的仓库分为模块仓库,本地仓库,远程私有仓库,远程公有仓库等的选择。
  • 模块属性继承,就是parent模块的功能了
  • 多模块编译,多模块编译与打包的时候,需要按照依赖次序先后执行多个模块的编译与打包。
  • 官网 下载二进制包,解压后加入以上的环境变量

    mvn -v

    成功后运行以上命令能看到结果,我的是3.6.3版本

    这里

    资源filter,就是在编译时,对资源进行属性值替换的操作

    这里

    这里

    这里

    这里

    7 多模块聚合与继承

    7.1 模块继承

    代码在 这里

    ├── parent │   └── pom.xml └── subModule ├── pom.xml └── src ├── main │   └── java │   └── com │   └── mycompany │   └── app │   └── App.java └── test └── java └── com └── mycompany └── app └── AppTest.java 13 directories, 4 files

    目录结构如上,我们在同一个目录中建立了两个模块,parent模块与subModule模块。

    这里

    模块聚合的目的是,将多个互相依赖的模块进行统一的编译打包等操作

    这里

    模块继承就是子模块中进行parent标签的配置,目的是为了继承父模块的配置。而模块聚合就是父模块中进行modules标签的配置,目的是为了同时编译打包和识别多个模块。两者并不冲突,我们也经常混合在一起经常使用。

  • Multi Module Maven Project and Running Flyway before build start
  • 8 条件配置

    8.1 条件配置与激活

    代码在这里

    这里 这里

    9.3 依赖Optional

    这里

  • MavenCenter ,官方最权威,提交较为严格
  • JCenter,提交稍为严格,但是已经停止服务了
  • JitPack ,像npm一样开放的仓库,提交最为开放,所以库也是最多的。
  • 项目 ,从这个项目中可以看出,这是一个多模块的Maven项目,但是我们不想将整个项目到上传到JitPack,只想上传它的其中一个模块。

    官网 ,右上角选择Sign In

    然后选择,我们的仓库,选择Releases,以及我们的版本号1.4,最后选择Get It就可以了。它就会自动拉代码下来编译打包,成为可被远程仓库加载的模块。

    11.3 引用JitPack依赖

    这里

    12.3 默认jdk

    这里

    参考资料有:

  • https://www.iteye.com/blog/rept-693415
  • https://zhuanlan.zhihu.com/p/354308625
  • https://www.cnblogs.com/kiwifly/p/12602407.html
  • 13.1 插件开发

    使用Idea创建插件项目,选择mojo脚手架即可

    mvn archetype:create -DgroupId=* -DartifactId=* -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-mojo

    或者使用mvn脚手架生成器,都是一样的

    两种方式都可以,但是最重要的是要定义好artifactId,artifactId有一套固定的规范。例如artifactId为cc-maven-plugin,那么IDEA就会识别这个插件名为cc,注意这个规范不能改,否则maven和IDEA会识别不了这个插件。

    bug

    mvn idea:module

    在顶层pom.xml文件,输入以上命令即可补充缺失的.iml文件。

    IDEA启动报错,无法找到org.springframework.boot

    idea开发 SpringBoot启动报错 程序包org.springframework.boot不存在,而使用maven 命令直接执行时无任何问题,不会报错。

    ![](/assets/img/2022-02-21-14-23-20.png

    解决方法是将启动分发给Maven来做,但是这样做会有很多额外的问题,例如是停止Maven的时候,并不能关闭程序,导致网络端口被占用。

    mvn idea:idea

    也有人说通过以上命令来解决,看这里

    20.6 Maven打包不进行单元测试

    这里

    参考资料:

  • Maven简要教程
  • 本文作者: fishedee
  • 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议 ,转载必须注明出处!
  • 2021-03-21-Java开发工具
  • 2021-06-17-Java性能分析工具
  • 2021-08-02-github经验汇总
  • 2021-07-03-Java标准库经验汇总
  • 2021-10-08-jooq经验汇总
  •