maven之packaging标签的使用

在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是必要的。今天我们来讲一讲<packaging>标签的作用。

首先maven作为一种XML标记语言,标签通常成对存在,目前packaging标签有3种配置:

<packaging>pom</packaging>
<packaging>jar</packaging>
<packaging>war</packaging>

1. <packaging>pom</packaging>

在父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件只作项目的子模块的整合,在maven install时不会生成jar/war压缩包。

一定有童鞋会问:为什么需要一个父级pom文件呢?
好处如下:

  • 可以通过<modules>标签来整合子模块的编译顺序(Maven引入依赖使用最短路径原则,例如a<–b<–c1.0 ,d<–e<–f<–c1.1,由于路径最短,最终引入的为c1.0;但路径长度相同时,则会引入先申明的依赖)。因此尽量将更加底层的service放在更先的位置优先加载依赖较为合适。
  • 可以将一些子项目中共用的依赖或将其版本统一写到父级配置中,以便统一管理。
  • groupId, artifactId, version能直接从父级继承,减少子项目的pom配置。

如下我给出了我写的项目的父级pom的样式:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://maven.apache.org/POM/4.0.0"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <packaging>pom</packaging>

 <groupId>cn.homie</groupId>
 <artifactId>ancient-culture</artifactId>
 <name>ancient-culture</name>
 <version>0.0.1-SNAPSHOT</version>

 <description>Carry forward the Chinese classical culture backend system. Author: Mr.Zyx
 </description>

 <modules>
 <!-- basic support service -->
 <module>homie_shared_service</module>
 <module>homie_auth_service</module>
 <module>homie_calendar_service</module>
 <!-- functional service -->
 <module>homie_user_service</module>
 <module>homie_forum_service</module>
 <module>homie_blog_service</module>
 <module>homie_divination_service</module>
 <!-- integration service -->
 <module>ancient-culture-api</module>
 </modules>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <springframework.version>5.2.1.RELEASE</springframework.version>
 <spring-data-jpa.version>2.2.2.RELEASE</spring-data-jpa.version>
 <springboot.version>2.1.8.RELEASE</springboot.version>
 <javax.persistence.version>2.2</javax.persistence.version>
 <javax.validation.version>2.0.1.Final</javax.validation.version>
 <jwt.version>3.0.0</jwt.version>
 <jackson.version>2.10.0</jackson.version>
 <net.sf.json-lib.version>2.4</net.sf.json-lib.version>
 <slf4j.version>1.7.29</slf4j.version>
 <commons-lang3.version>3.9</commons-lang3.version>
 <lombok.version>1.18.6</lombok.version>
 <tomcat.version>9.0.27</tomcat.version>
 <homie.service.version>0.0.1-SNAPSHOT</homie.service.version>
 </properties>

 <build>
 <plugins>
  <plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
   <encoding>UTF-8</encoding>
   <source>8</source>
   <target>8</target>
  </configuration>
  <groupId>org.apache.maven.plugins</groupId>
  <version>3.1</version>
  </plugin>
 </plugins>
 </build>
</project>

2. <packaging>jar</packaging>

Jar包是最为常见的打包方式,当pom文件中没有设置packaging参数时,默认使用jar方式打包。
这种打包方式意味着在maven build时会将这个项目中的所有java文件都进行编译形成.class文件,且按照原来的java文件层级结构放置,最终压缩为一个jar文件。
当我们使用mvn install命令的时候,能够发现在项目中与src文件夹同级新生成了一个target文件夹,这个文件夹内的classes文件夹即为刚才提到的编译后形成的文件夹。如下图所示,这是我自己的项目生成的target文件夹,而最下方的jar文件即为此文件夹的压缩版本。

3. <packaging>war</packaging>

war包与jar包非常相似,同样是编译后的.class文件按层级结构形成文件树后打包形成的压缩包。不同的是,它会将项目中依赖的所有jar包都放在WEB-INF/lib这个文件夹下,如图:

WEB-INF/classes文件夹仍然放置我们自己代码的编译后形成的内容。
可想而知,war包非常适合部署时使用,不再需要下载其他的依赖包,能够使用户拿到war包直接使用,因此它经常使用于微服务项目群中的入口项目的pom配置中。

总结

packaging中有3种不同的配置参数,它们各司其职、拥有差异的特性,给java web的构建与部署带来许多便利。

到此这篇关于maven之packaging标签的使用的文章就介绍到这了,更多相关maven packaging标签内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • maven <repositories>标签和<pluginRepositories>标签的使用

    在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等.每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复.重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难.此外,如果你使用版本管理工具,如SVN(你没有使用版本管理工具?马上试试SVN吧,它能帮你解决很多头疼的问

  • 解决IDEA中Maven项目中JSTL标签无效问题

    代码如下(忽略编译错误,不影响结果) 最近刚换IDEA用上Maven,之前一直都是用Eclipse.这回踩了个坑,所以跟大家分享一下. 当我准备在IDEA上用Maven创建SSM项目的时候,我发现页面的JSTL标签不生效,EL标签和导入的C标签会直接被输出. 例如上图最后页面显示的是${name},并没有输出我定义的"呵呵",在pom.xml文件中有jstl的依赖包,但死活不生效. 尝试了很多方法,网上找了很多资料,想起之前用IDEA创建普通web项目的时候,导入C标签会报错,需要手动

  • maven之packaging标签的使用

    在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是必要的.今天我们来讲一讲<packaging>标签的作用. 首先maven作为一种XML标记语言,标签通常成对存在,目前packaging标签有3种配置: <packaging>pom</packaging> <packaging>jar</packaging> <packaging>war<

  • Maven中resources标签的用法详解

    目录 一.resources作用 1.打包编译作用 2.配置文件取pom当中的值 二.演示resources打包编译的作用 1.创建springboot项目 2.进行编译打包 3.出现问题 4.得出结论 5.添加resources进行解决 三.演示application取pom当中值 1.创建springboot项目 2.进行编译打包 3.得出结论 4.添加resources进行解决 5.疑问 在开发当中,我们一般打包都是利用maven打包的,在项目当中我们经常会看见resources标签,可能

  • maven自动部署到远程tomcat服务器的方法

    使用maven的自动部署功能可以很方便的将maven工程自动部署到远程tomcat服务器,节省了大量时间. 本文章适用于tomcat的7.x ,8.x, 9.x版本. 下面是自动部的步骤 1,首先,配置tomcat的manager 编辑远程tomcat服务器下的conf/tomcat-users.xml,在末尾增加(其实只要拉到文件末尾,去掉注释改一下就可以了) <role rolename="manager-gui"/> <role rolename="m

  • Java的项目构建工具Maven的配置和使用教程

    一.Maven是什么 Maven是一个用java开发的项目构建工具, 它能使项目构建过程中的编译.测试.发布.文档自动化, 大大减轻了程序员部署负担. 二.安装Maven 安装maven非常简单,访问Maven官方页下载即可:http://maven.apache.org/download.cgi 下载完后配置M2_HOME环境变量, 然后终端运行mvn --version, 看到正确的输出提示,Maven就安装完成了. 三.Maven基本概念 Maven的核心思想是POM, 即Project

  • 构建Maven多模块项目的方法

    目录 构建Maven多模块项目 创建父模块 创建子模块:model层 创建子模块:dao模块 创建子模块:service层 创建子模块:web层 编译运行项目 Maven相关特性 父模块的配置 父模块聚合子模块 父模块统一管理依赖包 子模块在pom.xml中声明父模块 参考文章 构建Maven多模块项目 JavaWeb开发一般都会进行分层开发,通常分为 model,模型层 dao,数据访问层 service,业务逻辑层 web,表现层 分层后,各层职责明确,后期维护起来也会容易一些.接下来我们就

  • maven 指定version不生效的问题

    目录 maven 指定version不生效 有关maven依赖中的version 构件依赖解析机制 通过配置或命令行参数去设置远程仓库检查更新的策略 maven 指定version不生效 在项目中依赖一个 spring-security 版本时, 发现未生效, 调用报错 由于项目是依赖了srpingBoot <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spr

  • 关于maven使用过程中无法导入依赖的一些总结

    目录 maven使用过程中无法导入依赖的一些总结 maven不自动导入依赖问题 解决办法 maven使用过程中无法导入依赖的一些总结 作为一名java开发的新手,在学习中难免遇见各种问题,在此总结一下. 在使用maven过程中总是碰见某些依赖导不进去的问题,本人使用的是idea2017.maven3.2版本,通过网上搜索和自己的经验归纳为一下几点: 1.settings.xml文件中远程仓库地址的设置 在maven仓库的配置文件中,一般设置远程仓库地址为阿里云的私服,国外的网站也可以就是比较慢,

  • Idea中SpringBoot多模块项目的建立实现

    What 内含一个或多个maven模块的SpringBoot项目称为SpringBoot多模块项目 Why 便于维护 将一个大的单体项目分成多个子模块有利于模块间的维护, 删除或移动单个模块时对其他模块的影响也比较小 单个模块还可以复用 共享依赖 只需要在父类中定义公共的依赖项,子类模块都会共享父类的依赖项 在大型项目中会使得代码更容易简洁. How 1.父模块 创建父项目(SpringBoot) 删除不需要的目录 去除src .mvn mvnw mvnw.cmd 文件 pom packagin

  • SpringBoot集成多数据源解析

    一,前面我们介绍了springboot的快速启动,大家肯定对springboot也有所了解,下面我们来介绍一下springboot怎么集成多数据源. 在有的项目开发中需要在一个项目中访问多个数据源或者两个项目之间通信(实质上是互相访问对方的数据库),在这里,我们介绍一下在一个项目中如何集成多个数据源(即访问多个不同的数据库),因为在项目中有时会有这种需求,比如在一个大型项目开发中,一个数据库中保存数据的索引,各种使用频繁的数据,另一个数据库中保存其他的数据. 1.下面我们来讨论一个问题,怎么集成

  • SpringBoot与docker的结合的示例

    最近一段时间,容器化成为了一种趋势.一台服务器可以虚拟成多个容器,同时提供服务,共享硬件资源,节约成本,容器化的翘楚就是Docker,我司的所有微服务的发布都已经容器化.spring boot 也紧跟潮流,加入了Docker的maven插件,可以通过执行命令来制作镜像. 本节的主要内容不是讲代码,而是讲这个Docker插件.废话不多说,上pom <plugin> <groupId>com.spotify</groupId> <artifactId>docke

随机推荐