目录儿

  • 1 创建父项目
  • 2 创建子项目
  • 3 额外补充
    • 3.1 dependencyManagement标签
    • 3.2 scope标签
    • 3.3 spring-boot-maven-plugin打包插件
      • 3.3.1 repackage配置项的作用
        • 不加`repackage`配置项打包
        • 加上`repackage`配置项

1 创建父项目

用 Maven 的原型模板创建一个项目作为父项目


然后就进入工程了,接着要修改文件字符编码为UTF-8

设置注解生效

选择编译器版本

编辑一下需要忽略的文件(根据文件后缀区分),后面上传git的时候忽略这些后缀结尾的文件

到这里基本设置完成,接下来看pom.xml
打开pom.xml,把以下几个标签去掉,我们不需要

  <!-- 删掉name标签 --><name>...</name><!-- 删掉url标签 --><url>...</url><!-- 删掉inceptionYear标签 --><inceptionYear>...</inceptionYear><!-- 删掉distributionManagement标签 --><distributionManagement>...</distributionManagement><!-- 删掉reporting标签 --><reporting>...</reporting><!-- 删掉build标签下面的pluginManagement标签,保留plugin标签 --><build><pluginManagement>...</pluginManagement></build>

添加一个<dependencyManagement></dependencyManagement>标签
完了以后就是这个样子,空空荡荡干干净净白白嫩嫩

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 模块版本信息,由 Maven 版本决定不用动它 --><modelVersion>4.0.0</modelVersion><!-- 父项目基本信息 --><groupId>org.example</groupId><artifactId>echoo-sample</artifactId><version>1.0.0</version><!-- 属性,一般用来定义依赖的版本 --><properties></properties><!-- 依赖统一管理 --><dependencyManagement></dependencyManagement><!-- 构建 --><build><!-- 插件 --><plugins></plugins></build></project>

接下来就是导入需要用的基本依赖(按自己的需求导入)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 模块版本信息,由 Maven 版本决定不用动它 --><modelVersion>4.0.0</modelVersion><!-- 父项目基本信息 --><groupId>org.example</groupId><artifactId>echoo-sample</artifactId><version>1.0.0</version><!-- 属性,一般用来定义依赖的版本 --><properties><spring.boot.version>2.3.2.RELEASE</spring.boot.version><spring.cloud.version>Hoxton.SR9</spring.cloud.version><spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version></properties><!-- 依赖统一管理 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring-cloud-dependencies --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring-cloud-alibaba-dependencies --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring-boot-starter-web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><!-- spring-boot测试 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>${spring.boot.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement><!-- 构建 --><build><!-- 插件 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><!-- maven中跳过单元测试 --><configuration><skip>true</skip></configuration></plugin></plugins></build></project>

删除父项目中的src目录

2 创建子项目

可以创建一个,也可以直接导入
我是直接复制了一个模块到父项目的根路径
目录结构如下:

修改provider8031子项目pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"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><!-- 父项目信息 --><parent><groupId>org.example</groupId><artifactId>echoo-sample</artifactId><version>1.0.0</version></parent><groupId>com.echoo.cloud.nacos.provicer</groupId><artifactId>provider8031</artifactId><version>1.0.0</version><name>provider8031</name><description>nacos-provider8031</description><packaging>jar</packaging><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 热部署,单独作用于模块,所以不用声明在父pom --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- 服务健康监控 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Nacos 服务注册/服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies><!-- 项目构建配置 --><build><!-- 生成的 jar 包名称 --><finalName>provider-one</finalName><plugins><!-- 因为是 SpringBoot 项目,所有 spring-boot-maven-plugin 插件打包 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- 打包配置 --><executions><execution><goals><!-- 重新打包,把所有依赖都打进 jar 包中,这样打出来的包就可以直接独立运行,因为里面包含了所有依赖 --><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

主要>注意两个点
1.< parent >标签填的信息就是父项目的基本信息
2.记得添加spring-boot-maven-plugin 打包插件repackage配置

特别注意:打包插件配置在有启动类的模块就行,父项目和一些基础项目没有启动类的模块不用配置打包插件,否则在父项目执行install时会报错:Unable to find main class
(Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.4:repackage (default) >on project starter: Execution default of goal org.springframework.boot:spring-boot-maven->plugin:2.7.4:repackage failed: Unable to find main class)

3 额外补充

3.1 dependencyManagement标签

dependencyManagement:在父模块中创建一个统一的依赖管理

子模块中可以选择性继承父类dependencyManagement中的依赖,因为此标签中的依赖子pom不会自动继承,而需要额外声明。但是,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,这样做的好处就是确保版本一致,方便版本统一管理。

3.2 scope标签

  • compile:默认值,可省略不写。此值表示该依赖需要参与到项目的编译、测试以及运行周期中,打包时也要包含进去。
  • test:该依赖仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
  • runtime:该依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段。
  • provided:该依赖在打包的时候可以不用包含进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude(排除)操作。
  • system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径
  • import:这个比较特别,不是常规意义上的scope,它只在dependencyManagement元素下才有效果,作用是将需要导入的目标POM中的dependencyManagement里面的所有dependency依赖导入并合并到当前POMdependencyManagement中。

3.3 spring-boot-maven-plugin打包插件

3.3.1 repackage配置项的作用

不加repackage配置项打包

repackage配置项注释掉

<!--<goal>repackage</goal>-->

打包安装

先看打出来的jar包的大小,只有5KB

再用WinRAR解压软件打开,文件非常少,基本就是这个模块本身的编译文件(.class)

打开provider-one.jar\META-INF\MANIFEST.MF,只有一些基本的构建信息,没有MainClass,StartClass信息。

尝试运行这个jar包,妥妥报错,因为它没有指定入口程序,依赖也不全。

这样打出来的jar包不能用

加上repackage配置项

 <!-- 项目构建配置 --><build><!-- 生成的 jar 包名称 --><finalName>provider-one</finalName><plugins><!-- 因为是 SpringBoot 项目,所有 spring-boot-maven-plugin 插件打包 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- 打包配置 --><executions><execution><goals><!-- 重新打包,把所有依赖都打进 jar 包中,这样打出来的包就可以直接独立运行,因为里面包含了所有依赖 --><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

这样子打包会生成俩文件,一个是.jar包,一个是jar.original文件

jar.original文件会发现和之前不配置repackage打出来的.jar包大小一样,暂时不知道这个文件怎么打开。
再看jar包,大小比不配置repackage打出来的.jar包大了很多。直接打开它看看

目录结构变了,多了个BOOT-INF,在provider-one.jar\BOOT-INF\lib里面有这个模块需要用到的各种jar包。

这里可以证明repackage配置项会把模块所依赖的jar打进包里,让这个jar包可以独立运行。
马上试一下运行这个jar包,果然没毛病

搭建Maven父子项目结构相关推荐

  1. 深入理解微服务Maven父子项目构造以及项目打包部署

    一.问题背景 随着微服务项目的越来越流行,更多的公司开始使用微服务来搭建自己的业务系统.微服务很好地解耦了业务,每一个服务只提供特定的功能,真正的做到了各司其职,互不干扰,同时微服务间可以互相通信,可 ...

  2. IDEA 创建SpringBoot多级Maven父子项目

    IDEA 创建SpringBoot多级MAVEN父子项目 一.环境准备 1.JDK安装配置 2.MAVEN安装配置 二.项目搭建 1.创建顶级Maven项目 附: 一级项目完整`pom.xml`配置 ...

  3. Eclipse创建Maven父子项目

    1.项目需求 今天就介绍在Eclipse中创建Maven父子项目,举一个例子,需要建立如下关系的Maven项目. 2.构建一个父级maven项目 新建一个Maven项目,如下图所示: 选择默认工作空间 ...

  4. idea搭建 maven web项目

    idea搭建 maven web项目 1.Create new Project 2.选择Maven,勾选Create from archetype 在archetype中选择:org.apache.m ...

  5. 黑猴子的家:Maven 父子项目

    1.创建maven项目,删除src文件 2.编辑pom.xml文件,配置<packaging>pom</packaging> 3.第二层maven父子项目和第一次maven父子 ...

  6. 2-1. Maven 三层项目结构搭建

    前言 通过上文:1-3. 开发环境安装(全),我们完成了开发环境的安装! 本文开始第二章:二.项目结构搭建 正所谓:万丈高楼平地起,打好地基是关键! 主要内容:创建Maven项目.三层架构说明.搭建三 ...

  7. 使用idea搭建maven+ssm项目

    先新建一个maven的项目 1.file->new->project->next 2.maven->勾选creat from archetype->webapp,同时选择 ...

  8. 创建Maven父子项目及发布到tomat的完整过程

    最近在搞一个项目,要自己创建一个maven的子项目,总结一下以后自己看: 1.创建一个父项目 NEW -->project-->maven-->maven Project,点击下一步 ...

  9. 基于IDEA搭建JavaWeb入门项目结构(2021版)

    前言:对于很多从eclipse等IDE迁移到IDEA开发工具的小伙伴,对于如何在IDEA上创建JavaWeb入门项目结构不太了解.或者即使创建成功也能勉强使用也不知其所以然.针对于此,写该篇博客予以总 ...

最新文章

  1. java排序——桶排序
  2. centos 系统初始配置优化
  3. 解码大脑:在脑机接口上寻求稳定性
  4. Oracle PCTfree assm,Oracle 段空间管理方式与PCTFREE和PCTUSED的概念
  5. 【数据结构与算法】之深入解析“二叉树的后序遍历”的求解思路与算法示例
  6. hive(4)——元数据概述
  7. 招聘│微软云计算英雄帖来了,快接招!
  8. 第四章 治病法要(1)
  9. css超出隐藏显示省略号
  10. Qt文档阅读笔记-Multiple Inheritance Example 实例解析及Automatic Connections解析
  11. 第十次课:Python函数(一)
  12. 微课有关计算机应用基础,【计算机仿真论文】微课在计算机应用基础课的应用(共3802字)...
  13. 三人表决器实验报告总结_三人表决器实验报告
  14. fxp连接失败_用FLASHFXP连接站点,总显示连接失败(连接丢失),该怎么办呢
  15. 阿里P9又有新瓜,而我却是技术圈的一股清流
  16. Docker基本命令
  17. java递归函数返回值_java基础5(方法、有无返回值、重载、递归)
  18. win32 字体 api学习总结
  19. mysql 1045 centos_解决centos下MySQL登录1045问题
  20. 用matlab画同心圆,求同心圆的同心度

热门文章

  1. 尼罗红——一种比较实用的脂质荧光染料
  2. MPLS BGP 跨域(OptionA/B/C(一/二))
  3. 解决ohmyzsh下载时连接超时
  4. JsTree 最详细教程及完整实例
  5. html5 jstree树形菜单,树形插件jsTree
  6. STM32Cube的USB_device软件库说明
  7. 红队是做什么?该学什么才能成为呢?
  8. java poi设置单元格格式为数值_java中导出excel设置单元格的样式为数字格式怎么设置_Java代码实现设置单元格格式...
  9. 2003年度十个空气污染最严重的城市
  10. java中的导入gnu,【JAVA学习笔记】静态导入