前言

系统复杂了,抽离单一职责的模块几乎是必须的;若需维护多个项目,抽离公用包上传私有仓库管理也几乎是必须的。其优点无需赘述,以下将记录操作过程。

1. 多模块拆分

在.NET 中由于其统一性,实现上更自然一点。Spring Boot 通过 Maven 构建多模块工程也不麻烦,假如我的项目中包含以下几个包:

我需要将他们分别拆分成独立模块,首先要修改的是根目录下的 pom.xml,packaging 类型改为 pom,并添加 modules 节点:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.youclk.multi-package</groupId>
  6. <artifactId>parent</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <modules>
  9. <module>api</module>
  10. <module>service</module>
  11. <module>dao</module>
  12. </modules>
  13. <packaging>pom</packaging>
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.10.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. <lombok>1.16.20</lombok>
  25. </properties>
  26. <dependencies>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.projectlombok</groupId>
  34. <artifactId>lombok</artifactId>
  35. <version>${lombok}</version>
  36. </dependency>
  37. </dependencies>
  38. </project>

之后新建一个个 Module,将对应的代码移植过去:

需要注意的是在启动模块的 pom.xml 中需要指定启动类:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <configuration>
  7. <mainClass>com.youclk.multipackage.api.MultiApplication</mainClass>
  8. <layout>ZIP</layout>
  9. </configuration>
  10. </plugin>
  11. </plugins>
  12. </build>

统一升级版本命令:mvn versions:set -DnewVersion=0.0.1-SNAPSHOT,到此差不多完成了,引用方式与普通的依赖包一致:

  1. <dependency>
  2. <groupId>com.youclk.multi-package</groupId>
  3. <artifactId>service</artifactId>
  4. <version>0.0.1-SNAPSHOT</version>
  5. </dependency>

补充

外层 pom :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.youclk</groupId>
  7. <artifactId>et2</artifactId>
  8. <packaging>pom</packaging>
  9. <version>${own-project.version}</version>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.1.0.RELEASE</version>
  14. <relativePath/> <!-- lookup parent from repository -->
  15. </parent>
  16. <modules>
  17. <module>start</module>
  18. <module>service</module>
  19. <module>client</module>
  20. </modules>
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <java.version>1.8</java.version>
  25. <own-project.version>1.0.0</own-project.version>
  26. </properties>
  27. <dependencyManagement>
  28. <dependencies>
  29. <dependency>
  30. <groupId>com.youclk</groupId>
  31. <artifactId>start</artifactId>
  32. <version>${own-project.version}</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>com.youclk</groupId>
  36. <artifactId>service</artifactId>
  37. <version>${own-project.version}</version>
  38. </dependency>
  39. </dependencies>
  40. </dependencyManagement>
  41. <dependencies>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-aop</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-starter-test</artifactId>
  53. <scope>test</scope>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-starter-web</artifactId>
  58. </dependency>
  59. <dependency>
  60. <groupId>org.projectlombok</groupId>
  61. <artifactId>lombok</artifactId>
  62. </dependency>
  63. </dependencies>
  64. </project>

内层 pom

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>com.youclk</groupId>
  8. <artifactId>et2</artifactId>
  9. <version>1.0.0</version>
  10. </parent>
  11. <artifactId>service</artifactId>
  12. <packaging>jar</packaging>
  13. <version>${own-project.version}</version>
  14. </project>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>com.youclk</groupId>
  8. <artifactId>et2</artifactId>
  9. <version>1.0.0</version>
  10. </parent>
  11. <artifactId>start</artifactId>
  12. <packaging>jar</packaging>
  13. <version>${own-project.version}</version>
  14. <dependencies>
  15. <dependency>
  16. <groupId>com.youclk</groupId>
  17. <artifactId>service</artifactId>
  18. </dependency>
  19. </dependencies>
  20. </project>

注意 start 模块下的包结构为根结构,不要加 .start,否则要指定需要扫描的包。

2. Nexus3 私有仓库搭建

Docker 时代一切都变得异常简单,Compose 配置如下:

  1. version: '3.5'
  2. services:
  3. nexus:
  4. image: sonatype/nexus3:3.10.0
  5. networks:
  6. - proxy
  7. - youclk
  8. volumes:
  9. - /mnt/nas/db/nexus-data:/nexus-data
  10. deploy:
  11. mode: replicated
  12. labels:
  13. - com.df.notify=true
  14. - com.df.port=8081
  15. - com.df.serviceDomain=nexus.youclk.com
  16. restart_policy:
  17. condition: any
  18. max_attempts: 3
  19. update_config:
  20. delay: 5s
  21. order: start-first
  22. resources:
  23. limits:
  24. cpus: '0.50'
  25. memory: 1g
  26. networks:
  27. proxy:
  28. external: true
  29. youclk:
  30. external: true

启动过程需要一分钟左右:



需要注意的是如果你的 ssl 是在负载均衡或者其他的反向代理之上,那么必须在 HTTP 头中指定 X-Forwarded-Proto 传输协议为 HTTPS,然后,就可以愉快地玩耍了。

3. 上传与引用

3.1 上传

首先需要在 Nexus 创建私有仓库,例如我的:



其次在本地 maven 设置中添加 server 节点,默认在 ~/.m2/settings.xml

  1. <servers>
  2. <server>
  3. <id>youclk</id>
  4. <username>admin</username>
  5. <password>youclk</password>
  6. </server>
  7. </servers>

pom.xml 中添加上传地址:

  1. <distributionManagement>
  2. <repository>
  3. <id>nexus</id>
  4. <name>Releases Repository</name>
  5. <url>https://nexus.youclk.com/repository/youclk-releases/</url>
  6. </repository>
  7. <snapshotRepository>
  8. <id>nexus</id>
  9. <name>Snapshot Repository</name>
  10. <url>https://nexus.youclk.com/repository/youclk-snapshots/</url>
  11. </snapshotRepository>
  12. </distributionManagement>

最后执行 mvn clean deploy 便会上传至私有仓库,单独传包命令如下:

  1. mvn deploy:deploy-file -DgroupId=com.youclk -DartifactId=utils -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=target/utils-0.0.1-SNAPSHOT.jar -Durl=https://nexus.youclk.com/repository/youclk/ -DrepositoryId=youclk

管理和查看:

3.1 引用

Finally,最后的最后就是怎么使用啦~ 如果需要全局引用的话需要在 settings.xml 添加和激活仓库:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings>
  3. <mirrors>
  4. <mirror>
  5. <id>aliyun</id>
  6. <mirrorOf>central</mirrorOf>
  7. <name>central mirror</name>
  8. <url>http://maven.aliyun.com/mvn/repository</url>
  9. </mirror>
  10. <mirror>
  11. <id>nexus</id>
  12. <mirrorOf>maven-public</mirrorOf>
  13. <name>private mirror</name>
  14. <url>http://local-nexus.youclk.com/repository/maven-public/</url>
  15. </mirror>
  16. </mirrors>
  17. <servers>
  18. <server>
  19. <id>nexus</id>
  20. <username>admin</username>
  21. <password>youclk</password>
  22. </server>
  23. </servers>
  24. <profiles>
  25. <profile>
  26. <id>nexus</id>
  27. <repositories>
  28. <repository>
  29. <id>maven</id>
  30. <name>local private nexus</name>
  31. <url>http://local-nexus.youclk.com/repository/maven-public/</url>
  32. <releases>
  33. <enabled>true</enabled>
  34. </releases>
  35. <snapshots>
  36. <enabled>true</enabled>
  37. </snapshots>
  38. </repository>
  39. </repositories>
  40. <pluginRepositories>
  41. <pluginRepository>
  42. <id>maven</id>
  43. <name>local private nexus</name>
  44. <url>http://local-nexus.youclk.com/repository/maven-public/</url>
  45. <releases>
  46. <enabled>true</enabled>
  47. </releases>
  48. <snapshots>
  49. <enabled>true</enabled>
  50. </snapshots>
  51. </pluginRepository>
  52. </pluginRepositories>
  53. </profile>
  54. </profiles>
  55. <activeProfiles>
  56. <activeProfile>nexus</activeProfile>
  57. </activeProfiles>
  58. </settings>

不过一般不推荐这么写,settings.xml 应该尽可能保持简洁,精简配置,此处留下代理和权限认证即可,其余的可以移植到 pom.xml 中:

  1. <repositories>
  2. <repository>
  3. <id>aliyun</id>
  4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5. </repository>
  6. <repository>
  7. <id>nexus</id>
  8. <url>http://local-nexus.youclk.com/repository/maven-public/</url>
  9. </repository>
  10. </repositories>
  11. <pluginRepositories>
  12. <pluginRepository>
  13. <id>central</id>
  14. <url>
  15. http://maven.aliyun.com/nexus/content/groups/public/
  16. </url>
  17. </pluginRepository>
  18. <pluginRepository>
  19. <id>maven-public</id>
  20. <url>http://local-nexus.youclk.com/repository/maven-public/</url>
  21. </pluginRepository>
  22. </pluginRepositories>

小结


我的公众号《有刻》,我们共同成长!

Spring Boot 多模块与 Maven 私有仓库的更多相关文章

  1. Maven 搭建spring boot多模块项目(附源码),亲测可以,感谢原创

    原创地址:https://segmentfault.com/a/1190000005020589 我的DEMO码云地址,持续添加新功能: https://gitee.com/itbase/Spring ...

  2. Maven 搭建spring boot多模块项目

    Maven 搭建spring boot多模块项目 备注:所有项目都在idea中创建 1.idea创建maven项目 1-1: 删除src,target目录,只保留pom.xml 1-2: 根目录pom ...

  3. 实战maven私有仓库三部曲之一:搭建和使用

    在局域网内搭建maven私有仓库,可避免每次都从中央仓库下载公共jar包,另外将A模块作为二方库发布到私有仓库后,B模块可以很方便的引用,今天我们就来实战maven私有仓库的搭建和使用: 原文地址:h ...

  4. 使用Nexus配置Maven私有仓库

    使用Nexus配置Maven私有仓库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装配置Nexus 1>.下载nexus 下载地址:https://www.sonat ...

  5. Spring Boot 多模块项目创建与配置 (一) (转)

    Spring Boot 多模块项目创建与配置 (一) 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都 ...

  6. Spring Boot 多模块项目创建与配置 (一)

    最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都使用spring boot框架.之前有零零散散学过一些 ...

  7. 安装Maven并搭建Maven私有仓库

    一.说明 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.我们在进行Java代码开发的时候,Eclipse+Maven+Jetty是一个十 ...

  8. 【图文并茂】 做开发这么久了,还不会搭建服务器Maven私有仓库?这也太Low了吧

    大家好,我是冰河~~ 最近不少小伙伴想在自己公司的内网搭建一套Maven私服环境,可自己搭建的过程中,或多过少的总会出现一些问题,问我可不可以出一篇如何搭建Maven私服的文章.这不,就有了这篇文章嘛 ...

  9. Spring Boot 多模块项目创建与配置 (转)

    转载:https://www.cnblogs.com/MaxElephant/p/8205234.html 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多 ...

随机推荐

  1. Apache Commons Configuration读取xml配置

    近期项目自己手写一个字符串连接池.因为环境不同有开发版本.测试版本.上线版本.每一个版本用到的数据库也是不一样的.所以需要能灵活的切换数据库连接.当然这个用maven就解决了.Apache Commo ...

  2. Servlet处理流程分析-Servlet学习之旅(二)

    tomcat的处理处理客户端流程分析 tomcat即是servlet容器也具有web服务器的功能,即也具有html页面的功能. 1.首先客户端会将html请求发给tomcat内置的web服务器 2.w ...

  3. MariaDB存储引擎

    MariaDB存储引擎 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是MariaDB的特点,而且是一种插入式的存储引擎概念.这决定了MariaDB数据库中的表可 ...

  4. MySQL 如何使用索引 较为详细的分析和例子

    在数据库表中,使用索引可以大大提高查询速度. 假如我们创建了一个 testIndex 表: CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name V ...

  5. 设计比较好,有助于学习的Github上的iOS App源码 (中文)

    Github版 中文 : TeamTalk 蘑菇街. 开源IM. 电商强烈推荐. MyOne-iOS 用OC写的<一个> iOS 客户端 zhihuDaily 高仿知乎日报 Coding ...

  6. 解决 RtlCreateActivationContext() failed 0xc000000d

    gtest 示例的Debug版启动报错: Debug输出如下: 'sample1_unittest.exe': Loaded 'D:\LibSrc\gtest_1.7.0_build\Debug\sa ...

  7. 9、Libgdx的输入处理

    (官网:www.libgdx.cn) 不同的平台有着不同的输入方式.桌面用户可以通过键盘和鼠标与应用进行交互,基于浏览器的游戏也是这样.在Android中,鼠标被触摸屏所替代,通常没有实体键盘.And ...

  8. 第二篇、vlc-android之源码介绍

    注明 转载请注明出处:http://blog.csdn.net/cuiran/article/details/35987853 正文 继<第一篇.vlc-android之开篇介绍> htt ...

  9. Linux0.11 中对地址的管理

    个字节,段信息无法直接存放在段寄存器中(段寄存器只有2字节).Intel的设计是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT内的索引值(index). Linux中逻 ...

  10. 【一天一道LeetCode】#28. Implement strStr()

    一天一道LeetCode系列 (一)题目 Implement strStr(). Returns the index of the first occurrence of needle in hays ...