当前位置: 首页 > news >正文

Maven笔记(二):进阶使用

Maven笔记(二)-进阶使用

一、Maven分模块开发

分模块开发对项目的扩展性强,同时方便其他项目引入相同的功能。
image.png
将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享(类似Jar包一样之间引用、复用)。
image.png

开发步骤:

  1. 创建Maven项目
  2. 书写模块代码

分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分!根据自己需求,分模块构建各模块功能,形成一个独立的资源,其它模块使用时,使用依赖的模式进行引用。
对应在主模块的 pom.xml 文件中,使用 dependency 标签引入对应待使用的相关maven项目依赖!

  1. 通过Maven指令安装模块到本地仓库(install指令 mvn install),这样才能使得在其它模块中进行 compile操作时,才不会找不到本地仓库下的对应模块依赖jar!

团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)

二、依赖管理

2.1 依赖传递

image.png
如果项目中依赖了某个资源A,这个资源A中依赖了其它资源B。那么在该项目中已能直接使用资源B。

  • 依赖之间存在传递性,传递性分为:
  1. 直接依赖:中当前项目中通过依赖配置建立的依赖关系
  2. 间接依赖:被资源的资源如果依赖其他资源,当前项目就间接依赖其他资源

image.png

  • 依赖传递冲突问题:
  1. 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低哦,层级越浅,优先级越高。(eg:上图中的 2度资源优先级高于3度资源)
  2. 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。(eg:上图中的两个3度资源,谁先考前就使用谁)
  3. 特殊优先:pom配置文件中当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
  • 在IDEA 可以查看项目中的依赖关系图 maven --> show dependencies

image.png

2.2 可选依赖 optional

A依赖B,B依赖C,如果B不想将C依赖对A进行开发,或者是C想对外隐藏自己的依赖关系,可以通过 <optional> true </optional>标签来实现对C依赖的可选:

<dependency><groupId>com.itheima</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT</version><!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性--><optional>true</optional>
</dependency>

可以理解为B中的依赖不在进行传递操作! 项目A依赖B资源时,如果也使用了B中传递依赖C时,如果B资源中的该C资源设置为<optional>true</optional> ,则项目A中还需要在单独引入该隐藏的资源![隐藏自己的依赖,使依赖不传递 不透明]
image.png

2.3 排除依赖 exclusions

当A依赖B、B依赖C,如果A中不想将B依赖中的C依赖引入进项目,则可以通过排除依赖谁主动断开依赖的资源,被排除的资源无需确定版本,只需要指定 groupId、artifactId 即可!

<dependency><groupId>com.itheima</groupId><artifactId>maven_04_dao</artifactId><version>1.0-SNAPSHOT</version><!--排除依赖是隐藏当前资源对应的依赖关系--><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions>
</dependency>

刷新一下 maven 即可排除:[主动断开依赖的资源 不需要]
image.png

image.png

三、继承与聚合

3.1 聚合工程 modules

image.png

  • 聚合:将多个模块组织成一个整体,同时进行整个项目构建的过程称为聚合

  • 聚合工程:通常是一个不具有业务功能的”空“工程(有且仅有一个pom文件)

  • 作用: 使用聚合工程可以将多个工程编组,通过对聚合工程进行构建实现所包含的模块进行同步构建,当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题

  • 聚合工程开发

  1. 创建Maven模块,聚合工程(父工程)的导报类型为pom<packaging>pom</packaging>。每个maven工程都有对应的打包方式,默认为jar,web工程打包方式为war;
  2. 设置当前聚合工程所包含管理的子模块名称
<packaging>pom</packaging><!-- 子工程项目信息 -->
<modules><module>Module-common</module><module>Module-admin</module><module>Module-core</module>
</modules>

下图中的 Maven-Module 就是一个聚合工程,用来做**工程管理(管理其它模块)**的,做聚合的!
image.png 聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。会自动按照依赖关系进行构建,先构建没有依赖关系的项目后,在进行构建其它模块!
参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合。

3.2 继承关系 parent

  • 聚合工程出现的问题:
  1. 在所以子模块中,每个模块都需要配置自己的依赖资源,这会导致出现很多重复配置的依赖资源。
  2. 出现部分模块中出现了相同依赖的配置。
  3. 当需要将项目某个依赖的版本号进行调整时(某个模块对某个资源版本号不支持时),需要满足已修改,所有的子模块相关依赖都进行修改。

image.png
继承描述的是两个工程之间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。继承的作用:简化配置、减少版本冲突。

  • 继承关系开发
  1. 创建Maven集合工程(父工程),设置打包类型为pom(建议父工程打包方式设置为pom[上方聚合工程创建的方式])
  2. 在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency>……
</dependencies>

<dependencies>标签中的依赖是直接沿用到子工程中,全部子工程中都会统一使用。
image.png

  1. 在父工程的pom文件配置子工程中可选的依赖关系
 <dependencyManagement><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency>……</dependencies>
</dependencyManagement>

image.png

  1. 在子工程pom.xml中配置当前工程所继承的父工程
<!--定义该工程的父工程-->
<parent><groupId>com.itheima</groupId><artifactId>maven_parent</artifactId><version>1.0-SNAPSHOT</version><!--填写父工程的pom文件,根据实际情况填写(可以不写可以写)--><relativePath>../maven_parent/pom.xml</relativePath>
</parent>

image.png
image.png

  1. 在子工程中配置使用父工程中可选依赖的坐标

父工程pom文件下<dependencyManagement> 标签中的依赖是提供给子工程选择使用的依赖,只有在子模块pom中指定 该标签中的依赖相关信息后(注意在引用时不需要写版本号),才会沿用到子模块中!
image.png

  • 注意:

子工程中使用父工程中的可选依赖时,仅需要提供群组id和项目id,无需提供版本,版本由父工程统一提供,避免版本冲突!
子工程中还可以定义父工程中没有定义的依赖关系!
在pom文件中该可以使用 <properties> 标签来定义参数,统一控制依赖版本信息,在对应依赖中的<version>标签中通过 ${表达式}来确定对应版本号!(四、属性中介绍)
image.png

3.3 聚合与继承的区别

  • 作用

聚合用于快速构建项目,继承用于快速配置项目

  • 相同点

聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中;
聚合与继承均属于设计型模块,并无实际的模块内容。

  • 不同点

聚合是在当前父模块中配置关系,聚合可以感知到参与聚合的模块有哪些;
继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己。

四、属性管理

4.1 自定义属性 properties

属性的作用就是定义一个变量,然后在 pom 文件中直接引用即可。
image-20210805124018028.png
在为项目中的依赖版本控制的时候,能够快速的批量引用了同一变量的依赖版本。

  • 属性管理使用方式:
  1. 首先定义<properties>...</properties>标签
  2. <properties>标签中定义变量值

image.png

  1. 在依赖中使用变量名${变量变量名称}

image.png

4.2 资源文件引用属性 resource

不太主流使用

4.2.1 子工程配置文件中引用maven变量过程

  1. 首先在 聚合工程(父工程)pom 文件中的<properties>标签下定义待使用的属性值:

image.png

  1. 在子模块的配置文件中直接以同样方式${属性名} 引用改变了

image.png

  1. 聚合工程(父Maven)中,即使用properties标签定义了变量的pom文件中,扩大Maven的控制范围。
   <!--配置资源文件,该资源文件下以可以使用maven中的变量--><resources><resource><!-- 配置文件目录 --><directory>${project.basedir}/src/main/resources</directory><!-- 包含的文件类型 --><includes><include>**/*.properties</include><include>**/*.xml</include></includes><!-- 配置过滤规则 能够识别${}格式 --><filtering>true</filtering></resource></resources>

4.2.2 检测配置文件引用变量是否成功

通过以上设置之后就可以直接在 子工程 的配置文件下 使用 ${变量名称} 的方式读取到 聚合工程(父工程) pom 中设置的变量数据了。
这里我们将 Module-core 模块的打包模式设置为 war 包,这样打包后就能查看到 jdbc配置文件中的数据是否加载成功!
image.png

通过 install操作成功之后,在对应本地仓库中找到 对应 groupId 和 artifactId 下的该war包。然后 打开war包路径下的 /WEB-Inf/classses/配置文件
image.png

4.2.3 问题记录

  • 如果 install 过程中出现如下错误:
    • 方式一:

image.png
是因为 Maven在进行打war包时,必须要对应工程中必须要包含 web.xml 文件。 这里就需要在对应打war包的工程中创建对应的文件即可!(临时解决方案)
image.png

  • 方式二:

在对应需要打 war包 的子模块 的pom.xml 中配置 maven-war-plugin 打war插件:

 <build><resources><!--打包src/main/java下的文件--><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><!--打包src/main/resources文件夹下的文件--><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.3</version><configuration><!--  排除web.xml文件,没有web.xml文件时不报错 --><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build>
  • 执行 install 操作出现找不到jar 问题

这种情况,需要先在聚合工程中执行一下 compile 操作,然后在执行 install 操作
image.png

  • install 操作后,war包中不含配置文件

打war包成功之后,如果子工程 Module-core 的war中没有对应的 jdbc.properties 配置文件,则需要在该子工程的pom.xml 配置文件中 buidl 标签下 添加 resource 标签。

<build><resources><!--打包src/main/java下的文件--><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><!--打包src/main/resources文件夹下的文件--><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource></resources>
</build>

4.3 Maven中的其它属性

maven中的所有属性分为如下几级:

  1. 自定义属性(常用)
  2. 内置属性
  3. Setting属性
  4. Java系统属性
  5. 环境变量属性

image-20210805124411768.png

具体内容如下(一般使用不上):
在maven安装路径中的bin目录下执行 mvn help:system 命令 查询系统级的一些属性:
image.png

  • 在指令执行完成之后。对应的 Environment Variables 标签下对应的变量就是对应我们系统的环境变量属性:

image.png

  • 对应 System Properties 标签下的变量 对应的是 Java系统属性:

image.png

使用方式于自定义变量的方式一样,通过${变量名称}使用即可,平时一般情况使用不到,需要获取一些系统设置时可以用到。

4.4 版本管理

4.4.1 工程版本

  1. SNAPSHOT(快照版本)
  • 项目开发过程中临时输出的版本,成为快照版本
  • 快照版本会随着开发的进展不断更新
  1. RELEASE (发布版本)
  • 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
  • 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本

4.4.2 发布版本

这些版本一般不会保证他的安全性,eg:以前的qq会出新功能,提前让人尝鲜,就会发布一个 beta版本,表示已经经过了beta测试!

  • alpha版
  • beta版
  • 纯数字版

五、多环境配置与应用

5.1 多环境开发 profiles

maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境。
即是将一系列的自定义变量进行编组配置 同时 设置唯一 id,启动时通过命令 指定使用某组环境属性值!
image-20210805124805979.png

  • 在父工程(聚合工程)中进行多种环境的配置:
 <!-- 配置多环节 --><profiles><!-- 开发环境profile 配置 --><profile><id>env-dep</id><properties><jdbc.url>jdbc:mysql://localhost:3306/test</jdbc.url></properties><!-- 设定为默认启动的环境 --><activation><activeByDefault>true</activeByDefault></activation></profile><!-- 生产环境配置 --><profile><id>env-pro</id><properties><jdbc.url>jdbc:mysql://127.1.1.1:3306/test</jdbc.url></properties></profile><!-- 测试环境配置 --><profile><id>env-test</id><properties><jdbc.url>jdbc:mysql://127.0.0.0:3306/test</jdbc.url></properties></profile></profiles>

按照前面方式,在聚合工程中 通过 install项目之后,在对应的war包中查看 配置文件中是否正确加载了对应环境下的参数变量值!

  • 在父工程中,通过mvn 指令执行执行,选择指定环境配置变量

执行指令: mvn install -P 环境id(需要选择对应父工程下来执行该mvn指令)

  • mvn 指令 –P 环境定义id

image.png

执行完指令,确定好环境id后 ,查询war包中对应配置文件数据是否正确加载!
image.png

5.2 跳过测试插件

maven每次执行指令时,都会执行测试过程!能保证程序执行完成之后,打包的正确性!
image.png 但是有时候会存在一种特殊情况,需要不进行测试从而直接进行打包操作!
比如如下需求:程序开发完成后,有一个功能进行了调整,现在想上线进行测试,但是目前有一块功能还没调通没开发完则测试用例无法跑通,就会导致打包安装无法成功!这时候就行跳过测试!

5.2.1 IDEA 跳过测试用例

image.png
这种方式只能跳过所有的测试!

  • 使用命令的方式跳过测试

image.png
-D:表示添加参数
skipTest: 表示跳过测试

5.2.2 细粒度控制跳过测试

测试是一个插件 maven-surefire-plugin,所有需要在 <build>标签中进行设置!
<excludes></excludes> :排除标签
<includes></includes>:包含标签

 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><configuration><!-- 跳过测试 --><skipTests>false</skipTests><!-- 排除掉不参与测试的资源文件 --><excludes><exclude>**/Main.java</exclude></excludes></configuration></plugin></plugins></build>

image.png

六、maven私服(略)

场景:自己开发的资源,在别人需要使用时,只能通过U盘的方式进行传递! 因为重要仓库不能存入私人的资源jar。这种情况下就可以通过私服的方式来实现。
类似替代重要服务器,所作用范围为开发团队共享 或者 公司共享!image-20210805125240781.png

6.1 Nexus私服

Sonatype公司的一款maven私服产品

  • 下载地址:https://help.sonatype.com/repomanager3/download

  • 访问服务器 http://localhost:8081(默认端口:8081)、(jetty容器启动的)

  • 修改基础配置信息

安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口。

  • 修改服务器运行配置信息

安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间。

  • 启动服务器(命令行启动)nexus.exe /run nexus

6.2 私服资源操作流程分析

在没有私服之前,我们的jar资源都是存放在maven的本地仓库之中的。私服中也有对应的仓库!上传和下载都是在私服的仓库中进行打交道!
可以按照资源类型创建多个仓库来使用

  • ssm_dao:将自己开发的资源,可以放入私服中,团队也可从该仓库中进行获取
  • spring-context:第三方资源,从中央服务器下载的资源。 也可以直接实现放入私服中,这样所有资源都从私服中进行获取!(外网禁用的情况下,私服与中央服务器打交道)
  • ssm_pojo.snapshot :存入 临时、快照版本资源

image-20210805125509894.png

需求: 上传时能实现存入那个仓库,在下载时无需指定某个仓库!
实习方式:将所有仓库设置为一个仓库组。

6.3 私服仓库分类

image-20210805125522304.png

  • 宿主仓库:

第三方资源:指示的是中央仓库中都不含有的资源。比如 Oracle 数据库连接驱动!(因为涉及版权和开源所以中央仓库中没有)!

  • 代理仓库:不允许上传,只能下载
  • 仓库组:对所有仓库进行打包下载,只用于下载

6.4 资源的上传与下载

私服不能随便访问,需要在本地仓库中配置访问权限、上传位置(宿主地址)、下载访问权限、下载地址(仓库组地址)。
image-20210805125541963.png
以上设置都是进行设置本地仓库的配置文件maven安装地址/conf/settings.xml中进行设置:

6.4.1 本地仓库访问私服权限设置

需要在本地Maven配置文件settings.xml 的<servers>标签下进行设置:
image.png
私服中的服务器id就是对应私服中仓库的name。
image.png

  • 在nexus中设置允许匿名下载,如果不允许将不会从私服中下载依赖

image-20201119201910078.png

6.4.2 私服的访问地址(镜像)配置

需要在本地Maven配置文件settings.xml 的<mirrors>标签下进行设置,需要注释掉aliyun的配置。

<morrors><!-- 私服的访问路径 --><mirror><id>仓库组Id</id><!-- 资源来源:*表示所有 --><mirrorOf>*</mirrorOf><url>仓库组地址</url></mirror>
</morrors>

image.png

对应仓库组中 查看管理的仓库,需要将我们自建的仓库拉入仓库组
image.png

  • 如果私服中没有对应的jar,会去中央仓库下载,速度很慢。可以配置让私服去阿里云中下载依赖。

image-20210817102823906.png

6.4.3 项目工程中指定上传私服仓库 distributionManagement

需要在聚合工程的 pom文件中进行如下配置发布管理:

<distributionManagement><!-- 发布正式版本仓库 --><repository><!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--><id>heima-nexus</id><!--如果jar的版本是release版本,那么就上传到这个仓库,根据自己情况修改--><url>http://localhost:8081/repository/heima-releases/</url></repository><!-- 发布临时版仓库 --><snapshotRepository><!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--><id>heima-nexus</id><!--如果jar的版本是snapshot版本,那么就上传到这个仓库,根据自己情况修改--><url>http://localhost:8081/repository/heima-snapshots/</url></snapshotRepository>
</distributionManagement>
  • 发布资源到私服 mvn deploy

在向私服中发布资源时间,会根据版本号( SNAPSHOT / RELEASE )进行上传到正式版本仓库和临时版本仓库。
image.png
发布的资源会一直留下来,不会自动主动删除! 需要在私服中进行手动删除。

七、maven打包将配置文件放在jar包外[记录文件]

通过以下配置,将项目 依赖jar文件、resource下的所有资源文件 全部独立出来进行项目部署操作! 同时将这些文件数据 在加上 项目启动脚本将部署程序在独立压缩为一个zip。 方便项目部署操作!
最终效果通过 7.4中展现出来!

7.1 项目中Maven的配置

 <properties><!-- 注意设置该属性值与springboot版本一致,spring-boot-maven-plugin插件需要引用该属性与springboot版本保持一致 --><spring-boot.version>2.7.6</spring-boot.version>
</properties><build><plugins><!--打包jar[用于将项目打包成JAR文件] --><!-- [通过这些配置,可以生成一个包含特定Manifest信息的JAR文件,并排除不需要的资源文件,最终输出到指定的目录中。] --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><!--<includeSystemScope>true</includeSystemScope>--><!--不打包资源文件[jar中需要排除的文件] --><excludes><!-- 这里排除了所有文件(*.**)和所有子目录中的XML文件(*/*.xml) --><exclude>*.**</exclude><exclude>*/*.xml</exclude></excludes><!-- 归档配置 --><!-- archive标签内配置了JAR文件的Manifest文件内容。 --><archive><manifest><!-- [表示在Manifest文件中添加类路径] --><addClasspath>true</addClasspath><!--MANIFEST.MF 中 Class-Path 加入前缀 [表示在Manifest文件的Class-Path条目中添加前缀lib/]--><classpathPrefix>lib/</classpathPrefix><!--jar包不包含唯一版本标识 [表示JAR包不包含唯一版本标识。]--><useUniqueVersions>false</useUniqueVersions><!--指定入口类 [指定了JAR文件的入口类] --><mainClass>com.zdsf.u8cloudmanagementproject.U8CloudManagementProjectApplication</mainClass></manifest><manifestEntries><!--MANIFEST.MF 中 Class-Path 加入资源文件目录 [指定了资源文件目录为./resources/] --><Class-Path>./resources/</Class-Path></manifestEntries></archive><!--[配置JAR文件的输出目录为Maven项目构建目录(通常是target目录)] --><outputDirectory>${project.build.directory}</outputDirectory></configuration></plugin><!--拷贝依赖 copy-dependencies [这个插件用于处理项目的依赖。]--><!-- [主要功能是将项目的依赖库拷贝到target/lib/目录下。这样做的好处是可以将所有依赖库集中管理,便于项目的部署和运行。] --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><!-- 标签内定义了插件的执行配置。 --><executions><!-- 具体的执行任务 --><execution><id>copy-dependencies</id><!-- 表示这个任务在Maven的package阶段执行 --><phase>package</phase><goals><!-- goals标签内定义了要执行的目标,这里的目标是copy-dependencies,即拷贝依赖。 --><goal>copy-dependencies</goal></goals><!-- 定义了该执行任务的具体配置 --><configuration><!-- 指定了依赖文件的输出目录,这里使用Maven属性${project.build.directory},通常是target目录,后面加上/lib/子目录。 --><outputDirectory>${project.build.directory}/lib/</outputDirectory></configuration></execution></executions></plugin><!--拷贝资源文件 copy-resources --><plugin><artifactId>maven-resources-plugin</artifactId><!--执行配置--><executions><!--具体的执行任务--><execution><id>copy-resources</id><!-- 指定该任务在 Maven 的 package 阶段执行。 --><phase>package</phase><goals><goal>copy-resources</goal></goals><!--定义了该执行任务的具体配置--><configuration><!-- 定义了要拷贝的资源文件 --><resources><!-- 指定了资源文件的源目录,即 src/main/resources。 --><resource><directory>src/main/resources</directory></resource></resources><!-- 指定了资源文件的输出目录,这里使用 Maven 属性 ${project.build.directory},通常是 target 目录,后面加上 /resources 子目录。 --><outputDirectory>${project.build.directory}/resources</outputDirectory></configuration></execution></executions></plugin><plugin><!-- YUI Compressor Maven压缩插件 --><!--  YUI Compressor Maven 插件,用于压缩项目中的 JS 文件 --><groupId>net.alchim31.maven</groupId><artifactId>yuicompressor-maven-plugin</artifactId><version>1.5.1</version><!-- 这里指定了一个执行目标 compress,即压缩文件。 --><executions><execution><goals><goal>compress</goal></goals></execution></executions><!-- 开始配置插件的具体参数 --><configuration><!-- 读取js,css文件采用UTF-8编码 --><encoding>UTF-8</encoding><!-- 不显示js可能的错误 [设置为 false,表示不显示 JS 可能的错误。] --><jswarn>false</jswarn><!-- 若存在已压缩的文件,会先对比源文件是否有改动 有改动便压缩,无改动就不压缩 --><force>false</force><!-- 在指定的列号后插入新行 [设置为 -1,表示不插入新行] --><linebreakpos>-1</linebreakpos><!-- 压缩之前先执行聚合文件操作 [true,表示压缩之前先执行聚合文件操作]--><preProcessAggregates>true</preProcessAggregates><!-- 压缩后保存文件后缀 无后缀 --><nosuffix>true</nosuffix><!-- 源目录,即需压缩的根目录 [指定需压缩的根目录] --><sourceDirectory>src/main/resources/static/js</sourceDirectory><!-- 输出目录,即压缩后的目录 --><outputDirectory>${project.build.directory}/resources/</outputDirectory><force>true</force><!-- 压缩js和css文件 --><includes><include>**/*.js</include></includes><!-- 以下目录和文件不会被压缩 --><excludes><exclude>**/*.min.js</exclude><exclude>**/*.css</exclude><exclude>**/common/**</exclude><exclude>**/OrderDetails.js</exclude><exclude>**/ht_Administory/*.js</exclude><exclude>**/refund/*.js</exclude></excludes></configuration></plugin><!--spring boot repackage,依赖 maven-jar-plugin 打包的jar包 重新打包成 spring boot的jar包 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖 --><includes><!-- includes标签用于指定在打包时包含的依赖。这里配置了一个groupId和artifactId都为null的依赖,这实际上是一个占位符,表示不包含任何实际的依赖。 --><include><groupId>null</groupId><artifactId>null</artifactId></include></includes><!-- layout标签指定了打包的布局格式为ZIP。 --><layout>ZIP</layout><!--使用外部配置文件,jar包里没有资源文件 [addResources标签设置为true,表示在打包时使用外部配置文件,而不是将资源文件打包进JAR中。] --><addResources>true</addResources><!-- 指定了输出目录为Maven项目构建目录 --><outputDirectory>${project.build.directory}</outputDirectory></configuration><executions><!--执行目标repackage,表示重新打包 --><execution><goals><goal>repackage</goal></goals><configuration><!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar --><!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar --><!--<classifier>run</classifier> --></configuration></execution></executions></plugin><plugin><!-- 用于创建自定义分发包的插件 --><artifactId>maven-assembly-plugin</artifactId><configuration><!-- not append assembly id in release file name --><!-- 表示在生成的分发包文件名中不附加assembly ID。这样可以保持文件名的简洁。 --><appendAssemblyId>false</appendAssemblyId><descriptors><!-- 定义了一个描述符文件src/main/resources/package.xml,这个文件用于描述如何打包项目,包括哪些文件和目录需要包含在分发包中。 --><descriptor>src/main/resources/package.xml</descriptor></descriptors></configuration><!-- 插件的执行配置。 --><executions><execution><id>make-assembly</id><!-- 任务在Maven的package阶段执行 --><phase>package</phase><!-- 定义了要执行的目标,这里的目标是single,表示执行一次打包操作。 --><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>

[注意修改内容]:

  • spring-boot-maven-plugin 打包插件版本号

之间在配置的属性中进行修改即可!

  • 指定入口类位置

在 maven-jar-plugin 插件中的 mainClass 属性中需要根据自己项目对主类入口地址进行调整!

7.2 分发包插件配置文件

在项目源码中创建一个 package.xml 配置文件,用于 maven-assembly-plugin 分发包插件的调用!
image.png

  • package.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"><id>package</id><formats><format>zip</format></formats><includeBaseDirectory>true</includeBaseDirectory><!-- 将项目构建目录中的资源文件打包到压缩包中,并对特定类型的文件(如脚本文件)设置特定的权限和输出目录 --><fileSets><fileSet><!-- 源目录路径中 目录中选择所有 .bat 和 .sh 文件。 --><directory>${project.build.directory}/resources</directory><outputDirectory>/</outputDirectory><!-- 脚本文件在 linux 下的权限设为 755,无需 chmod 可直接运行 --><fileMode>755</fileMode><includes><include>*.bat</include><include>*.sh</include></includes></fileSet><fileSet><!-- 目录中选择所有非 .bat 和 .sh 文件 --><directory>${project.build.directory}/resources</directory><outputDirectory>/resources</outputDirectory><excludes><exclude>**/*.bat</exclude><exclude>**/*.sh</exclude></excludes></fileSet><fileSet><directory>${project.build.directory}/lib</directory><outputDirectory>/lib</outputDirectory></fileSet><fileSet><directory>${project.build.directory}</directory><outputDirectory>/</outputDirectory><includes><include>*.jar</include></includes></fileSet></fileSets></assembly>

7.3 项目启动脚本编写

在源码中创建四个项目启动相关的脚本文件,用于项目jar的启动操作!
这几个启动脚本会在打包时被 分发包插件 统一压缩到zip文件下,在项目部署时直接解压压缩包之后点击脚本即可启动项目!
image.png

[注意:所有脚本中的 **java -Dfile.encoding=utf-8 -jar xxxx.jar** 命令后面的xxx.jar jar包文件名称需要根据自己项目打包后的名称进行修改! 否则脚本无法实现项目启动功能! ]

  • restart.sh 脚本内容
#!/bin/bash
echo stop application
source stop.sh
echo start application
source start.sh
  • start.bat 脚本内容
@echo off
set "JRE_HOME=.\jre1.8.0_221"
set "JAVA_HOME=.\jdk1.8.0_221"
set "CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar"
path %path%;%JRE_HOME%\bin
path %path%;%JAVA_HOME%\bin
path
java -Dfile.encoding=utf-8 -jar u8CloudManagementProject-0.0.1-SNAPSHOT.jar
@pause
  • star.sh 脚本内容
#!/bin/bash
#(自己安装解压后的jdk路径----自行修改)
export JAVA_HOME=/user_normal/java/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
nohup java -Dfile.encoding=utf-8 -jar u8CloudManagementProject-0.0.1-SNAPSHOT.jar
  • stop.sh 脚本内容
#!/bin/bash
PID=$(ps -ef | WXJFSPCXGSJZYV2-2.0.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
thenecho Application is already stopped
elseecho kill $PIDkill $PID
fi

7.4 项目执行打包操作效果

通过maven 执行 package 操作后的 target 文件夹中的内容:

image.png
这样就实现了 资源和jar 分离的操作!
同时这里生成了一个.zip 压缩包,解压后进入该文件夹可以得到项目运行所需要的所有资源:
image.png

相关文章:

Maven笔记(二):进阶使用

Maven笔记&#xff08;二&#xff09;-进阶使用 一、Maven分模块开发 分模块开发对项目的扩展性强&#xff0c;同时方便其他项目引入相同的功能。 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享(类似Jar包一样之间引用、复用)…...

Apache ZooKeeper 及 Curator 使用总结

1. 下载 官网地址&#xff1a;Apache ZooKeeper 点击下载按钮 选择对应的版本进行下载 2. 使用 1、解压 tar -zxf apache-zookeeper-3.9.2-bin.tar.gz2、复制配置文件&#xff0c;有一个示例配置文件 conf/zoo_sample.cfg&#xff0c;此文件不能生效&#xff0c;需要名称为…...

深入探索:MATLAB中的硬件支持包(HSP)及其应用

在MATLAB环境中&#xff0c;硬件支持包&#xff08;HSP&#xff09;扮演着至关重要的角色&#xff0c;尤其是在与硬件交互和嵌入式系统开发方面。HSP提供了一套工具和库&#xff0c;使得MATLAB能够与特定的硬件平台进行有效通信&#xff0c;实现代码的生成和优化。本文将详细介…...

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…...

Day26_0.1基础学习MATLAB学习小技巧总结(26)——数据插值

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a; 1、《MATLAB基础教程 (第三版) (薛山)》 2、《MATL…...

SQL进阶技巧:火车票相邻座位预定一起可能情况查询算法 ?

目录 0 场景描述 1 数据准备 2 问题分析 2.1 分析函数法 2.2 自关联求解 3 小结...

神经网络构建原理(以MINIST为例)

神经网络构建原理(以MINIST为例) 在 MNIST 手写数字识别任务中&#xff0c;构建神经网络并训练模型来进行分类是经典的深度学习应用。MNIST 数据集包含 28x28 像素的手写数字图像&#xff08;0-9&#xff09;&#xff0c;任务是构建一个神经网络&#xff0c;能够根据输入的图像…...

【ArcGIS微课1000例】0123:数据库中要素类批量转为shapefile

除了ArcGIS之外的其他GIS平台,想要打开ArcGIS数据库,可能无法直接打开,为了便于使用shp,建议直接将数据库中要素类批量转为shapefile。 文章目录 一、连接至数据库二、要素批量转shp一、连接至数据库 打开ArcMap,或者打开ArcCatalog,找到数据库连接,如下图: 数据库为个…...

【Elasticsearch系列十九】评分机制详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

神经网络通俗理解学习笔记(3)注意力神经网络

Tansformer 什么是注意力机制注意力的计算键值对注意力和多头注意力自注意力机制注意力池化及代码实现Transformer模型Transformer代码实现BERT 模型GPT 系列模型GPT-1模型思想GPT-2模型思想GPT-3 模型思想 T5模型ViT模型Swin Transformer模型GPT模型代码实现 什么是注意力机制…...

【C#】 EventWaitHandle的用法

EventWaitHandle 是 C# 中用于线程间同步的一个类&#xff0c;它提供了对共享资源的访问控制&#xff0c;以及线程间的同步机制。EventWaitHandle 类位于 System.Threading 命名空间下&#xff0c;主要用于实现互斥访问、信号量控制等场景。 创建 EventWaitHandle 创建一个 E…...

设计模式之结构型模式例题

答案&#xff1a;A 知识点 创建型 结构型 行为型模式 工厂方法模式 抽象工厂模式 原型模式 单例模式 构建器模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 模板方法模式 职责链模式 命令模式 迭代器模式 中介者模式 解释器模式 备忘录模式 观…...

camtasia2024绿色免费安装包win+mac下载含2024最新激活密钥

Hey, hey, hey&#xff01;亲爱的各位小伙伴&#xff0c;今天我要给大家带来的是Camtasia2024中文版本&#xff0c;这款软件简直是视频制作爱好者的福音啊&#xff01; camtasia2024绿色免费安装包winmac下载&#xff0c;点击链接即可保存。 先说说这个版本新加的功能吧&#…...

如何导入一个Vue并成功运行

注意1&#xff1a;要确保自己已经成功创建了一个Vue项目&#xff0c;创建项目教程在如何创建Vue项目 注意2&#xff1a;以下操作均在VS Code&#xff0c;教程在VS Code安装教程 一、Vue项目导入VS Code 1.点击文件&#xff0c;然后点击将文件添加到工作区 2. 选择自己的vue项…...

封装svg图片

前言 项目中有大量svg图片&#xff0c;为了方便引入&#xff0c;所以对svg进行了处理 一、svg是什么&#xff1f; svg是可缩放矢量图形&#xff0c;是一种图片格式 二、使用步骤 1.创建icons文件夹 将icons文件夹放进src中&#xff0c;并创建一个svg文件夹和index.js&…...

tomcat的Catalinalog和localhostlog乱码

找到tomcat安装目录的loging文件 乱码这两个由UTF-8改为GBK...

行人持刀检测数据集 voc yolo

行人持刀检测数据集 9000张 持刀检测 带标注 voc yolo 行人持刀检测数据集 数据集描述 该数据集旨在用于行人持刀行为的检测任务&#xff0c;涵盖了多种场景下的行人图像&#xff0c;特别是那些携带刀具的行人。数据集包含大量的图像及其对应的标注信息&#xff0c;可用于训练…...

基于51单片机的汽车倒车防撞报警器系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 本课题基于微控制器控制器&#xff0c; 设计一款汽车倒车防撞报警器系统。 要求&#xff1a; 要求&#xff1a;1.配有距离&#xff0c; 用于把车和障碍物之间的距离信号送入控制器。 2.配有报警系…...

NLP 文本匹配任务核心梳理

定义 本质上是做了意图的识别 判断两个内容的含义&#xff08;包括相似、矛盾、支持度等&#xff09;侠义 给定一组文本&#xff0c;判断语义是否相似Yi 分值形式给出相似度 广义 给定一组文本&#xff0c;计算某种自定义的关联度Text Entailment 判断文本是否能支持或反驳这个…...

FastAPI 的隐藏宝石:自动生成 TypeScript 客户端

在现代 Web 开发中&#xff0c;前后端分离已成为标准做法。这种架构允许前端和后端独立开发和扩展&#xff0c;但同时也带来了如何高效交互的问题。FastAPI&#xff0c;作为一个新兴的 Python Web 框架&#xff0c;提供了一个优雅的解决方案&#xff1a;自动生成客户端代码。本…...

了解云容器实例云容器实例(Cloud Container Instance)

1.什么是云容器实例&#xff1f; 云容器实例&#xff08;Cloud Container Instance&#xff0c; CCI&#xff09;服务提供 Serverless Container&#xff08;无服务器容器&#xff09;引擎&#xff0c;让您无需创建和管理服务器集群即可直接运行容器。 Serverless是一种架构理念…...

OpenStack Yoga版安装笔记(十三)neutron安装

1、官方文档 OpenStack Installation Guidehttps://docs.openstack.org/install-guide/ 本次安装是在Ubuntu 22.04上进行&#xff0c;基本按照OpenStack Installation Guide顺序执行&#xff0c;主要内容包括&#xff1a; 环境安装 &#xff08;已完成&#xff09;OpenStack…...

[系列]参数估计与贝叶斯推断

系列 点估计极大似然估计贝叶斯估计&#xff08;统计学&#xff09;——最小均方估计和最大后验概率估计贝叶斯估计&#xff08;模式识别&#xff09;线性最小均方估计最小二乘估计极大似然估计&贝叶斯估计极大似然估计&最大后验概率估计线性最小均方估计&最小二乘…...

【Pyside】pycharm2024配置conda虚拟环境

知识拓展 Pycharm 是一个由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Python 编程语言的开发。Pycharm 提供了代码编辑、调试、版本控制、测试等多种功能&#xff0c;以提高 Python 开发者的效率。 Pycharm 与 Python 的关系 Pycharm 是…...

【RabbitMQ 项目】服务端:数据管理模块之消息队列管理

文章目录 一.编写思路二.代码实践 一.编写思路 定义消息队列 名字是否持久化 定义队列持久化类(持久化到 sqlite3) 构造函数(只能成功&#xff0c;不能失败) 如果数据库(文件)不存在则创建打开数据库打开 msg_queue_table 数据库表 插入队列移除队列将数据库中的队列恢复到内存…...

SDKMAN!软件开发工具包管理器

认识一下SDKMAN!(The Software Development Kit Manager)是您在Unix系统上轻松管理多个软件开发工具包的可靠伴侣。想象一下&#xff0c;有不同版本的SDK&#xff0c;需要一种无感知的方式在它们之间切换。SDKMAN拥有易于使用的命令行界面&#xff08;CLI&#xff09;和API。其…...

《使用 LangChain 进行大模型应用开发》学习笔记(四)

前言 本文是 Harrison Chase &#xff08;LangChain 创建者&#xff09;和吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《LangChain for LLM Application Development》&#xff08;使用 LangChain 进行大模型应用开发&#xff09;的学习笔记。由于原课程为全英文视频课…...

gbase8s数据库常见的索引扫描方式

1 顺序扫描&#xff08;Sequential scan&#xff09;&#xff1a;数据库服务器按照物理顺序读取表中的所有记录。 常发生在表上无索引或者数据量很少或者一些无法使用索引的sql语句中 2 索引扫描&#xff08;Index scan&#xff09;&#xff1a;数据库服务器读取索引页&#…...

边缘智能-大模型架构初探

R2Cloud接口 机器人注册 请求和应答 注册是一个简单的 HTTP 接口&#xff0c;根据机器人/用户信息注册&#xff0c;创建一个新机器人。 请求 URL URLhttp://ip/robot/regTypePOSTHTTP Version1.1Content-Typeapplication/json 请求参数 Param含义Rule是否必须缺省roboti…...

《python语言程序设计》2018版第8章18题几何circle2D类(上部)

一、利用第7章的内容来做前5个点 第一章之1--从各种角度来测量第一章之2--各种结果第二章之1--建立了针对比对点在圆内的几段第二章之2--利用建立的对比代码&#xff0c;得出的第2点位置 第一章之1–从各种角度来测量 class Circle2D:def __init__(self, x, y, radius):self._…...