项目结构
接下来我将开始尝试创建基于SpringCloud的eureka微服务项目架构,首先看一下项目的总体文件模块结构:
其对应的Maven模块结构如下:
springcloud-parent中pom.xml
springcloud-parent中pom.xml的作用
springcloud-parent父模块在这里的作用主要有如下这么几点:
- 指定项目的公共依赖模块
比如说下面的指定spring boot的parent,也就是说指定当前模块是哪一个Maven模块的子模块,这样自该模块下的所有子模块,全部都会继承该parent父模块中的依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
它的另一个作用是指定子模块所继承的公共依赖,比如说junit测试依赖,比如说logging日志依赖等等都是如此。
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
- 加载子Maven模块
Maven父模块是通过如下方式自动加载子模块的:
<modules>
<module>springcloud-goods-item</module>
<module>springcloud-goods-order</module>
<module>springcloud-eureka</module>
<module>springcloud-eureka2</module>
<module>springcloud-goods-item2</module>
<module>springcloud-api-gateway</module>
<module>springcloud-config-server</module>
<module>springcloud-config-resources</module>
<module>rabbit-mq-resources</module>
<module>springcloud-goods-db</module>
</modules>
这样我们在父模块中执行Maven指令,其Maven指令会自动的传递到子Maven模块中执行,比如说下面的指令就是如此:
mvn clean
它的意思是清理父模块以及子模块中的target文件夹
- 指定子Maven模块的软件版本
根据Maven的规则,一旦在父模块中指定版本号,其子模块就不用指定版本号了,因为子模块的版本号默认与父模块相同。
- 指定子Maven模块的插件信息
其通过plugins来指定子模块中所使用的插件版本及信息,这样子模块中就无需重复再写了,直接使用父模块中的插件及对应的版本,比如说Maven的编译插件maven-compiler-plugin等。
- 指定子Maven模块的资源打包方式
在这里,其指定的是将Spring Cloud的配置文件*.yml
视为资源文件进行使用,比如说打入war包等。当然,位于resources文件夹内的文件,默认就是资源文件,所以说这里也可以省略。
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
- 指定Maven项目的私服上传地址
当我们配置好了distributionManagement,我们可以通过使用如下指令将项目发布到私服中:
mvn deploy -Dmaven.test.skip=true
其中的 -Dmaven.test.skip=true
指的是忽略测试文件。
- 统一子模块中的父模块版本号
这里使用maven-resources-plugin插件来统一Maven众多子模块中的parent的版本号信息。
当我们修改了父模块的版本号时,我们要统一修改子模块中的版本号信息,此时我们可以直接执行如下命令:
mvn -N versions:update-child-modules
当然,我们还可以使用另一种方式,就是在所有的子模块的parent中通过EL表达式指定父模块的版本号,如下:
<version>${springcloud.goods.version}</version>
这里的代码亲测可用,只是在IDEA中报错,但是并不影响使用,而由于我有洁癖,看着IDE报红,实在不忍直视,所以说就没有采用这种方式,而是直接通过maven-resources-plugin来进行统一管理。
源码
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<groupId>com.lyc</groupId>
<artifactId>springcloud-parent</artifactId>
<version>1.0-RELEASE</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>springcloud-goods-item</module>
<module>springcloud-goods-order</module>
<module>springcloud-eureka</module>
<module>springcloud-eureka2</module>
<module>springcloud-goods-item2</module>
<module>springcloud-api-gateway</module>
<module>springcloud-config-server</module>
<module>springcloud-config-resources</module>
<module>rabbit-mq-resources</module>
<module>springcloud-goods-db</module>
</modules>
<name>SpringCloud微服务</name>
<url>http://www.example.com</url>
<dependencies>
<!--添加junit5测试依赖-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
<!-- lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<!--spring-boot日志依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
</dependencies>
<!--发布项目到Maven私服-->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>releases for lyc</name>
<url>http://118.190.210.59:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>snapshots for lyc</name>
<url>http://118.190.210.59:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<build>
<finalName>${project.artifactId}</finalName>
<!--必须加入下面的代码,因为不加的话,有的时候能加载配置文件,有的时候不能加载,
而如果加入的话,那么其一定能够将其加载到配置文件中。
-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<generateBackupPoms>false</generateBackupPoms>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>