Java工程搭建最佳方案之Maven
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java工程搭建最佳方案之Maven相关的知识,希望对你有一定的参考价值。
前言
从头开始一个项目。第一步是划分系统模块。
Maven是Java世界中最流行的项目管理工具。它提供继承和聚合功能,因此可以将项目划分为多个模块。它非常符合微服务的思想,是实现微服务工程的良好工具。从头开始一个项目。第一步是划分系统模块。
Maven是Java世界中最流行的项目管理工具。它提供继承和聚合功能,因此可以将项目划分为多个模块。它非常符合微服务的思想,是实现微服务工程的良好工具。
微服务和Maven聚合模块的区别
Microservice是一个可以独立部署的项目,Maven的聚合功能可以将多个模块(项目)聚合到一个大项目中进行管理,而这个大项目本质上仍然是一个独立的项目。但是,在maven聚合之后,只需单击一次,就可以在所有项目中执行相同的操作。例如,当在父项目中执行MVN clean命令时,Maven将在它下面找到子项目,以便逐个执行clean操作。
电商微服务系统
目前,大多数系统都有PC管理接口和移动接口(门户模块),即后台管理系统和前台商场系统。还有各种商品模块、订单模块和用户模块。
- 后端管理模块(openapi)
- 门户模块(openapi)
- 订单模块
- 商品模块
具体怎么设计项目结构,还需要看不同的需求。
项目结构
单体应用
在单个应用程序中首先要考虑的是代码重用,这在具有前台和后台的系统中更为常见。例如,需要使用商品列表的前端和后端接口。
借鉴GitHub最后一个开源项目,单一的项目结构更加合理。
microservice的一些组件如下,但不能说它是一个真正的microservice系统,因为订单等业务模块是不拆分的。
微服务架构
我曾经在一家社会电子商务初创公司工作,公司的项目设计理念非常先进,微服务非常细致。然而,开发人员编写代码非常复杂,因为每个微服务都有一个新的项目需要维护。这会导致一个问题。如果开发人员的功能涉及多个模块,他需要同时打开多个idea窗口来编写代码。同时,当OpenAPI使用feign调用内部微服务接口(如order模块)时,需要将另一个interface@requestmapping复制到OpenAPI。
如下图所示,每个微服务都可以作为一个模块存在。外部OpenAPI不需要包含子项目,而内部microservice API需要分为两个子模块:API和provider。向使用者提供API接口jar包。
通过实践,API子模块可以定义接口和@requestmapping,提供者模块的控制器可以实现提供服务的接口。在使用者导入API子模块之后,feign接口继承API接口并可以被调用。
项目搭建
我们就以简单的自建zmall工程为例说明idea搭建工程的步骤。github地址为:
结构为:
- zmall(聚合父工程,pom工程,管理依赖版本)
- mall-common(各模块通用的工具类)
- mall-admin(openapi后台管理端接口)
- mall-portal(openapi移动端页面接口)
- mall-goods(商品模块,微服务,内网调用不对外)
- mall-goods-api(商品模块微服务的接口定义,可打包成jar提供给消费端)
- mall-goods-provider(商品模块业务实现)
- mall-order(订单模块模块,微服务,内网调用不对外)
- mall-order-api(订单模块微服务的接口定义,可打包成jar提供给消费端)
- mall-order-provider(订单模块业务实现)
建立pom父工程
建立一个Maven项目,Maven坐标一般的定义为:
- groupId:到项目级别,一般能明确公司和项目即可。如io.github.zebinh.zmall。以spring为例则为org.springframework
- artifactId:到项目下的模块,一般使用短横线风格模块功能,如基础架构通用部分可以 用base-framework,业务部分可以加项目名,如mall-admin。以spring为例则为spring-core,spring-context等
建立完成后,POM的主要配置如下。作为统一项目管理。
<?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>
<!-- POM父工程主要统一管理子模块的依赖版本问题,体现Maven的继承和聚合功能 -->
<!-- 项目坐标 -->
<groupId>io.github.zebinh.mall</groupId>
<artifactId>zmall</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- spring-boot-starter-parent统一管理版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!-- 统一管理属性和版本,这里的配置在启动时起作用,类似mvn -D参数传递-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
<swagger2.version>2.7.0</swagger2.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- SwaggerUI API文档生成工具 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
复制代码
建立子模块
以zmall-admin为例,建立一个spring boot工程,作为zmall的子模块。idea创建工程时记得修改以下几个点。
- 新建工程时注意模块名转为包名时,加一个点号分隔。
- 创建完后,需要修改pom文件的parent坐标等。
建立带有子模块的模块
类似mall-goods,其也是一个pom工程,其下有多个子模块。创建时需要注意以下问题。
- 模块名加上短横线
- 使用spring initializer建子模块mall-goods-provider时,需要加长到子模块目录
- 以上都需要修改pom文件
当然,pom文件中也可以使用repositories配置仓库
maven仓库查找顺序:maven允许在pom文件和settings.xml文件中配置仓库的位置,其会根据maven仓库的id的字典序号来搜索仓库。因此如你只是临时使用阿里云仓库代替中央仓库,在pom.xml中配置id为a开头的阿里云仓库,这样就能排在前边解析了。
Maven仓库和私服设置
Maven的用户配置文件.m2目录下的settings.xml一般配置如下几项:
- localRepository:统一Maven本地仓库
- servers:配置私服用户名和密码
- repositories, pluginRepositories:私服或远程仓库配置,一般可以包含在profiles中做多配置,使用activeProfiles激活指定配置
- profiles:配置多个,激活指定的一个
- distributionManagement:使用mvn deploy时会部署到指定的私服,但是一般开发中不会指定。而是使用git下载代码mvn install安装到本地仓库。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- maven本地仓库位置 -->
<localRepository>/develop/mavenRepository</localRepository>
<!-- 私服用户密码,稳定版和快照版分开 -->
<servers>
<server>
<id>nexus-releases</id>
<username>zebinh</username>
<password>abcdefg</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>zebinh</username>
<password>abcdefg</password>
</server>
</servers>
<!-- 使用!非,除了私服外,都使用阿里云仓库加速 -->
<mirrors>
<mirror>
<id>mirror</id>
<mirrorOf>!nexus-releases,!nexus-snapshots</mirrorOf>
<name>mirror</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<!-- 多配置 -->
<profiles>
<profile
<id>nexus</id>
<repositories>
<repository>
<id>nexus-releases</id>
<url>https://repo.aliyun.com/repository/1234-release/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>https://repo.aliyun.com/repository/1234-snapshot/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-releases</id>
<url>https://repo.aliyun.com/repository/1234-release/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-snapshots</id>
<url>https://repo.aliyun.com/repository/1234-snapshot/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 激活指定的配置 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
复制代码
搭建项目骨架
理论指导依据:
各层的命名:
首先搭建mall-goods-api
Mal admin和Mal portal是openapi,因此它们下面的包需要由模块命名,如goods.controller和order.controller。然而,商场商品API是一种商品的微服务,不需要划分模块。
API是接口层,用于管理和门户调用。输出VO对象。因此需要定义URL路径和VO对象,mal商品提供者模块实现API接口。具体如下:
接着搭建mall-admin openapi
上面搭好了goods微服务,mall-admin则可以引入mall-goods-api来调用goods模块了。如下图:
至此,maven工程搭建结束。代码github地址:github.com/zebinh/zmal…
以上是关于Java工程搭建最佳方案之Maven的主要内容,如果未能解决你的问题,请参考以下文章
Java之SpringBoot+tk.Mybatis(5分钟搭建WEB工程-手把手)