Java工程搭建最佳方案之Maven

前言

从头开始一个项目。第一步是划分系统模块。

Maven是Java世界中最流行的项目管理工具。它提供继承和聚合功能,因此可以将项目划分为多个模块。它非常符合微服务的思想,是实现微服务工程的良好工具。从头开始一个项目。第一步是划分系统模块。

Maven是Java世界中最流行的项目管理工具。它提供继承和聚合功能,因此可以将项目划分为多个模块。它非常符合微服务的思想,是实现微服务工程的良好工具。

微服务和Maven聚合模块的区别

Microservice是一个可以独立部署的项目,Maven的聚合功能可以将多个模块(项目)聚合到一个大项目中进行管理,而这个大项目本质上仍然是一个独立的项目。但是,在maven聚合之后,只需单击一次,就可以在所有项目中执行相同的操作。例如,当在父项目中执行MVN clean命令时,Maven将在它下面找到子项目,以便逐个执行clean操作。

电商微服务系统

目前,大多数系统都有PC管理接口和移动接口(门户模块),即后台管理系统和前台商场系统。还有各种商品模块、订单模块和用户模块。

  • 后端管理模块(openapi)
  • 门户模块(openapi)
  • 订单模块
  • 商品模块

具体怎么设计项目结构,还需要看不同的需求。

项目结构

单体应用

在单个应用程序中首先要考虑的是代码重用,这在具有前台和后台的系统中更为常见。例如,需要使用商品列表的前端和后端接口。
借鉴GitHub最后一个开源项目,单一的项目结构更加合理。

microservice的一些组件如下,但不能说它是一个真正的microservice系统,因为订单等业务模块是不拆分的。

微服务架构

我曾经在一家社会电子商务初创公司工作,公司的项目设计理念非常先进,微服务非常细致。然而,开发人员编写代码非常复杂,因为每个微服务都有一个新的项目需要维护。这会导致一个问题。如果开发人员的功能涉及多个模块,他需要同时打开多个idea窗口来编写代码。同时,当OpenAPI使用feign调用内部微服务接口(如order模块)时,需要将另一个[email protected]复制到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…

原文地址:https://www.cnblogs.com/aishangJava/p/12350065.html

时间: 2024-10-25 20:38:25

Java工程搭建最佳方案之Maven的相关文章

单工程搭建springmvc+spring+mybatis(maven,idea)

单工程搭建springmvc+spring+mybatis(maven,idea) 1.pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven

手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51415366,谢谢! 本文会介绍从一个最基本的java工程,到Web工程,到集成Spring.SpringMVC.SpringDataJPA+Hibernate. 平时我们可能是通过一个模板搭建一个工程,或者是直接导入一个项目,而本文选择从最基本的java工程开始,目的是为了展示更多原理. 当然,我们还是从一个最基本的Maven工程开始,其实普通的非Maven工程,搭建过程几乎是一模一样的,

mybatis入门(一)创建java工程搭建mybatis环境

先创建一个java工程MybatisProject,在src下面建包和实体类,并在数据库创建相同的person表,然后导入mybatis-3.4.6.jar包 package com.liusong.entity; public class Person { private int id; private String name; private int age; public Person() { super(); this.id = id; this.name = name; this.ag

自己记录java环境搭建之-maven

简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首先到Eclipse Marketplace中下载Maven Integration for Eclipse WTP, 如下, 之后查看是否成功下载,Window -> ShowView -> Maven 2. 下载Maven的bin http://maven.apache.org/download

利用开源软件搭建JAVA工程CI&CD自动化工具链

JAVA传统项目交付流程的问题 开发和运维间环境有明显差异 代码缺乏统一质量度量 客户要求上线时间紧,人工测试慢,导致测试不充分,时常做线上BUG修复 打造工具链 ● 源码管理Gitlab● 持续集成Jenkins● 代码扫描SonarQube● 接口测试PostMan+NewMan● 制品管理ArtifactoryOSS版本(仅支持Maven)● 自动部署Ansible GitLab安装 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=

001医疗项目-项目框架的搭建(四个maven工程)

这个项目资料来源于传智播客.用的是ssm框架, 我们首先建立一个working sets里面存放,我们的maven工程. 如下: yycg-maven730是working sets的项目,里面存放四个maven工程(springmybatis,yycgparent,yycgutil,yycgproject). 为什么我们要创建四个maven工程这么麻烦呢. 原因如下: 1.1.1      以maven作为架构进行模块划分 Maven是一个优秀的项目管理工具,提高项目管理效率. 使用maven

Java工程转换为Maven工程-b

1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Java工程转换为Maven工程的工作也是有帮助的. 2. 创建Java工程. 创建一个Java工程,如下图所示: 3. 转换为Maven工程. 选中此工程 -> 右键 -> Configure -> Convert to Maven project.出现如下的截图,天上相关的信息即可:  点击F

maven环境搭建以及手动创建maven工程

今天开始学习maven,maven是一个项目管理和构建的工具,使用起来非常方便,有了maven我们可以很方便的将项目编译,打包运行等,Maven能够很方便的帮我们管理项目报告,生成站点,管理JAR文件,等等. maven下载 首先需要到maven的官网下载maven: http://maven.apache.org/download.cgi# 这里我下载到E:\maven\apache-maven-3.3.3目录 环境变量配置 下载完成之后,需要配置环境变量,将maven项目根目录下的bin目录

使用maven插件对java工程进行打包

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包.而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包.我们可以通过配置插件来对工程进行打包,pom具体配置如下: maven-assembly-plugin Xml代码   <plugin> <artifactId>maven-assembly-plugin