maven之packaging标签的使用
作者:半城风花半城雨 发布时间:2021-10-25 05:14:42
在使用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的构建与部署带来许多便利。
来源:https://blog.csdn.net/imaginehero/article/details/103706732
猜你喜欢
- 1. pom.xml文件配置<?xml version="1.0" encoding="UTF-8&qu
- 一、线程的优先级别线程优先级别的使用范例:package cn.galc.test;public class TestThread6 { p
- synchronized关键字,一般称之为”同步锁“,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。同步锁锁的是同一
- 成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的。下面就让我们来看看代码编写的30条建议吧。(1) 类名首字母应该大写。字段
- C# 关于Invoke首先说下,invoke和begininvoke的使用有两种情况:control中的invoke、begininvoke
- 本文实例讲述了Java单例模式下的MongoDB数据库操作工具类。分享给大家供大家参考,具体如下:我经常对MongoDB进行一些基础操作,将
- 一、IO流的分类字符流ReaderInputStreamReader(节点流)BufferedReader(处理流)WriterOutput
- 详解java中的PropertyChangeSupport与PropertyChangeListenerjava中的PropertyChan
- 配置不生效的解决办法注意:如果配置不生效,则说明spring优先加载了其他配置:解决办法:添加启动参数 -Dlogging.config=c
- 简介在实现登录功能时,一般为了安全都会设置验证码登录,为了防止某个用户用特定的程序暴力破解方式进行不断的尝试登录。常见验证码分为图片验证码和
- 介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求
- 近日,开发者头条上分享了一篇“小米java第二轮面经”,有很多的java程序员表示非常有兴趣。下面就和各位分享小米java第二轮面经:0、谈
- InputStreamReader和OutputStreamWriter源码分析1. InputStreamReader 源码(基于jdk1
- 自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以
- 一,网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中I
- 最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。但是究竟什么是全网
- 本文实例为大家分享了Java Swing实现扫雷源码的具体代码,供大家参考,具体内容如下先来看下效果运行时只需要创建一个GameWindow
- 自定义工具类PropertyUtil,并在该类的static静态代码块中读取properties文件内容保存在static属性中以供别的程序
- [LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子
- 背景分析在项目的开发中,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预