Maven笔记

2022/07/09 Maven 共 5189 字,约 15 分钟

Maven 笔记

参考

maven是什么

  • 依赖管理:对 jar 的统一管理(Maven 提供了一个 Maven 的中央仓库,https://mvnrepository.com/,当我们在项目中添加完依赖之后,Maven 会自动去中央仓库下载相关的依赖,并且解决依赖的依赖问题)
  • 项目构建:对项目进行编译、测试、打包、部署、上传到私服等

snapshot

如果是快照板,表示都是小更新,每次构建都会拉最新的。

依赖范围

img

依赖优先级

1.第一原则,路径最近依赖原则
A - B - sb.jar
A - sb.jar        (√)
2.第二原则,最先声明依赖原则
A - B - sb.jar    (√)
A - C - sb.jar

聚合

其存在的意义在于快速构建项目

<!-- 目录结构 
  parent
    父pom.xml
  account-email
    pom.xml
  account-persist
    pom.xml -->
<!-- 配置 -->
<modules>
  <module>../account-email</module>
  <module>../account-persist</module>
</modules>
<!-- 目录结构 
  父pom.xml
  account-email
    pom.xml
  account-persist
    pom.xml -->

<!-- 配置 -->
<modules>
    <module>account-email</module>
    <module>account-persist</module>
</modules>

多模块项目展示

|--javaboy-parent
      |-- javaboy-cms
      |-- javaboy-crm
      |-- javaboy-manger
           |-- javaboy-manager-model
           |-- javaboy-manager-dao
           |-- javaboy-manager-service
           |-- javaboy-manager-web

以 javaboy-manger 为例,javaboy-manager 本身并不提供功能,它只负责管理他自己的子模块,而他的子模块每一个都无法独立运行,需要四个结合在一起,才可以运行。项目打包时,model、dao、service 都将打包成 jar,然后会自动将打包好的 jar 复制到 web 中,再自动将 web 打包成 war 包。

Idea可以通过new module来创建, 会默认指明了当前 Module 的 parent。

然后此时parent的pom.xml里会自动加modules等配置项。

注意这个parent有继承作用。可以在parent里做依赖管理。

有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:

  1. 不可以直接单独打包
  2. 如果要打包,有两种方式:
  • 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
  • 从聚合工程处打包,即从 web 的parent 处打包。

继承

继承是为了消除重复配置而存在的

表现为pom.xml的parent元素,子pom可以继承父pom中的配置,如依赖、属性等。

父模块只能打包为pom。

属性继承比较常用的有以下几个:

  properties:属性,类似于java的静态常量

  dependencies:依赖

  distributionManagement:部署配置,比如自定义组件的上传,会结合settings.xml里的server进行账号认证。

依赖管理(不会实际引入依赖):

  <dependencyManagement>元素,子模块引入时可以省略版本号的配置

  依赖管理scope元素可以设置为import,这个import必须结合dependencyManagement来使用。使用import通常指向一个pom文件,作用是将目标pom中的dependencyManagement配置导入合并到当前pom的dependencyManagement元素中使用。
  
  
父项目的dependency元素,子项目可以直接用。
dependencyManagement 子模块可以自助通过声明来引入,如果引入则只需要配置依赖的groupId以及artifactId即可

聚合与继承的关系

从上面可以看到多模块 Maven 项目中的聚合与继承其实是两个概念,其目的是完全不同的。聚合是为了方便快速构建项目,继承是为了消除重复配置。

对于聚合模块来说,它知道哪些被聚合的模块(通过modules元素),但那些被聚合的模块不知道这个聚合模块的存在。

对于继承关系的父 POM 来说,它不知道哪些子模块继承于它,但那些子模块都必须知道自己的父 POM 是什么。

在实际项目中,大家会发现一个 pom 即是聚合 pom,又是父 pom,这么做主要是为了方便。就像上面我们定义的聚合模块为 taobao-aggregator,父级模块为 taobao-parent,我们可以将其合并成为一个名为 taobao 的 pom 文件。这样清晰明了。

聚合和继承唯一的共性是其<packaging>元素的值都是pom

约定优于配置

Maven会假设用户的项目是这样的:

  1. 源码目录为:src/main/java/
  2. 编译输出目录为:target/classes/
  3. 打包方式为:jar
  4. 包输出目录为:target/

遵循约定虽然损失了一定的灵活性,用户不能随意安排目录结构,但是却能减少配置。更重要的是,遵循约定能够帮助用户遵守构建标准

没有约定,意味着10个项目可能使用10种不同的项目目录结构,这意味着交流学习成本的增加,而这种增加的成本往往就是浪费

任何一个Maven项目都隐式地继承自超级POM($MAVEN_HOME/lib/maven-model-builder-x.x.jar中的org/apache/maven/model/pom-4.0.0.xml),这有点类似于任何一个Java类都隐式地继承于Object类。因此大量超级POM的配置都会被所有Maven项目继承,这些配置也就成了Maven所提倡的约定

Maven 骨架archetype

Maven 的41种骨架

  1. internal -> appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型)
  2. internal -> appfuse-basic-spring (创建一个基于Hibernate,Spring和Spring MVC的Web应用程序的原型)
  3. internal -> appfuse-basic-struts (创建一个基于Hibernate,Spring和Struts 2的Web应用程序的原型)
  4. internal -> appfuse-basic-tapestry (创建一个基于Hibernate, Spring 和 Tapestry 4的Web应用程序的原型)
  5. internal -> appfuse-core (创建一个基于 Hibernate and Spring 和 XFire的jar应用程序的原型)
  6. internal -> appfuse-modular-jsf (创建一个基于 Hibernate,Spring和JSF的模块化应用原型)
  7. internal -> appfuse-modular-spring (创建一个基于 Hibernate, Spring 和 Spring MVC 的模块化应用原型)
  8. internal -> appfuse-modular-struts (创建一个基于 Hibernate, Spring 和 Struts 2 的模块化应用原型)
  9. internal -> appfuse-modular-tapestry (创建一个基于 Hibernate, Spring 和 Tapestry 4 的模块化应用原型)
  10. internal -> maven-archetype-j2ee-simple (一个简单的J2EE的Java应用程序)
  11. internal -> maven-archetype-marmalade-mojo (一个Maven的 插件开发项目 using marmalade)
  12. internal -> maven-archetype-mojo (一个Maven的Java插件开发项目)
  13. internal -> maven-archetype-portlet (一个简单的portlet应用程序)
  14. internal -> maven-archetype-profiles ()
  15. internal -> maven-archetype-quickstart ()
  16. internal -> maven-archetype-site-simple (简单的网站生成项目)
  17. internal -> maven-archetype-site (更复杂的网站项目)
  18. internal -> maven-archetype-webapp (一个简单的Java Web应用程序)
  19. internal -> jini-service-archetype (Archetype for Jini service project creation)
  20. internal -> softeu-archetype-seam (JSF+Facelets+Seam Archetype)
  21. internal -> softeu-archetype-seam-simple (JSF+Facelets+Seam (无残留) 原型)
  22. internal -> softeu-archetype-jsf (JSF+Facelets 原型)
  23. internal -> jpa-maven-archetype (JPA 应用程序)
  24. internal -> spring-osgi-bundle-archetype (Spring-OSGi 原型)
  25. internal -> confluence-plugin-archetype (Atlassian 聚合插件原型)
  26. internal -> jira-plugin-archetype (Atlassian JIRA 插件原型)
  27. internal -> maven-archetype-har (Hibernate 存档)
  28. internal -> maven-archetype-sar (JBoss 服务存档)
  29. internal -> wicket-archetype-quickstart (一个简单的Apache Wicket的项目)
  30. internal -> scala-archetype-simple (一个简单的scala的项目)
  31. internal -> lift-archetype-blank (一个 blank/empty liftweb 项目)
  32. internal -> lift-archetype-basic (基本(liftweb)项目)
  33. internal -> cocoon-22-archetype-block-plain ([http.//cocoapacorg2/maven-plugins/])
  34. internal -> cocoon-22-archetype-block ([http.//cocoapacorg2/maven-plugins/])
  35. internal -> cocoon-22-archetype-webapp ([http.//cocoapacorg2/maven-plugins/])
  36. internal -> myfaces-archetype-helloworld (使用MyFaces的一个简单的原型)
  37. internal -> myfaces-archetype-helloworld-facelets (一个使用MyFaces和Facelets的简单原型)
  38. internal -> myfaces-archetype-trinidad (一个使用MyFaces和Trinidad的简单原型)
  39. internal -> myfaces-archetype-jsfcomponents (一种使用MyFaces创建定制JSF组件的简单的原型)
  40. internal -> gmaven-archetype-basic (Groovy的基本原型)
  41. internal -> gmaven-archetype-mojo (Groovy mojo 原型)

常用的3种

建立Maven项目时,网上建议的分别是

  1. cocoon-22-archetype-webapp
  2. maven-archetype-quickstart 常用,表示是一个java项目,其实就是带了maven的java项目
  3. maven-archetype-webapp 一个简单的Java Web应用程序。 有jsp的MVC。

具体参考link

Search

    Table of Contents