目录儿
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
依赖导入并合并到当前POM
的dependencyManagement
中。
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
包,果然没毛病