如何在 OpenShift 上部署多模块 Maven Spring Boot 应用程序

2024-02-22

我有一个要部署的多模块 spring-boot 项目开放式换档 https://www.openshift.com/,我也在那里安装了 Jenkins。源代码托管在 Github 上。 每个模块都包含一场战争,以便拥有微服务结构:

    <modules>
        <module>xyz-common</module>
        <module>xyz-data-services</module> <!--a REST service to interact with mongodb-->
        <module>xyz-batch-importer</module> <!--a service to import files into Mongo-->
        <module>xyz-frontend</module>
    </modules>

我找到了部署单个 spring-boot 应用程序的教程,但我无法弄清楚这如何应用于多模块 Maven 项目。


如果您想在 openshift 上使用多模块 Maven 项目,那么您必须告诉 openshift 如何构建它们。您可以通过定义构建环境变量或编写可由 Openshift 解释的自定义构建脚本来完成此任务。

对于这两种方法,您都可以遵循this https://blog.openshift.com/maven-multi-module-projects-and-openshift/教程:

如果您想使用第一种方法,您可以通过为构建配置定义“MAVEN_ARGS_APPEND”变量来告诉 openshift 在构建过程时使用其他 Maven 命令。

因此,当构建操作在 openshift 上开始时,它会告诉 Maven 使用这些附加参数构建应用程序。

定义下面列出的其他构建环境变量以独立部署 war 模块:

MAVEN_ARGS_APPEND:-pl 模块名称 --also-make

ARTIFACT_DIR:模块名称/目标/

MODULE_DIR:模块名称

在这里,“-pl”命令提供了构建“xyz-data-services”及其所有依赖项的功能。因此,如果您的“xyz-data-services”模块依赖于“xyz-common”,那么maven将构建“xyz-common”,为“xyz-data-services”创建相关工件,将它们打包在一起并部署“xyz-数据服务”作为 Pod 上的战争。

在您的情况下,假设您想要将“xyz-data-services”模块和“xyz-front-end”模块打包为 war 并部署它们。

Case 1:

如果您想让这些模块可自行部署,那么您必须创建两个将在不同 Pod 上运行的应用程序。

第一个应用程序将具有以下构建环境变量:

MAVEN_ARGS_APPEND:  -pl xyz-data-services --also-make
ARTIFACT_DIR:       xyz-data-services/target/
MODULE_DIR:         xyz-data-services

第二个将有这些人:

MAVEN_ARGS_APPEND:  -pl xyz-front-end --also-make
ARTIFACT_DIR:       xyz-front-end/target/
MODULE_DIR:         xyz-front-end

Case 2:

如果您想将这些模块部署到同一个 pod 中,那么您可以向项目中添加一个附加模块,将两个 war 打包到单个 Ear 中并定义该 Ear 的变量。

所以让这个耳朵是“webapp”,你的父pom看起来像这样;

...
<modules>
     <module>xyz-common</module>
     <module>xyz-data-services</module>  
     <module>xyz-batch-importer</module> 
     <module>xyz-frontend</module>
     <module>xyz-webapp</module>
</modules>
...

xyz-webapp pom 看起来像;

....
<artifactId>xyz-webapp-</artifactId>  
<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>xyz-common</artifactId>
        <version>${project.version}</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>xyz-data-services</artifactId>
        <version>${project.version}</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>xyz-frontend</artifactId>
        <version>${project.version}</version>
        <type>war</type>
    </dependency>
</dependencies>
.... 

所以你的构建环境变量将是;

MAVEN_ARGS_APPEND:  -pl xyz-webapp --also-make

ARTIFACT_DIR:   xyz-webapp/target/

MODULE_DIR:    xyz-webapp

如果您只想使用单个战争和单个 Pod,那么;

Case 3:

您可以将前端应用程序打包为 war 并声明对其他模块的依赖关系,这些模块都打包为“.jars”

您可以继续选择您想要的案例。这里重要的是,它取决于您的“微服务”实现。由于“微服务”术语和实现没有明确定义,并且可能会因架构或某些业务需求而异,因此您可以决定将前端、API、后端打包在一起还是独立管理它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 OpenShift 上部署多模块 Maven Spring Boot 应用程序 的相关文章

随机推荐

  • JavaScript 有时在 android 的 webview 中不起作用

    我在我的应用程序中放置了一个 webview 来访问包含一些 JavaScript 函数的网页 我的目的是当用户单击网页中的链接时 它将在应用程序中启动一个新的活动 我写了 webSettings setJavaScriptEnabled
  • 如何在实际示例中使用 javascript 模块模式?

    我正在尝试理解 JavaScript 模块模式 我已经看过它应该是什么样子的示例 但我不明白如何使用它 例如 这里发生了一些事情 input share on click function loading html img class re
  • 无论大小如何,如何使项目保持在屏幕中央? [复制]

    这个问题在这里已经有答案了 我试图使这些框在屏幕上水平居中 无论视口的面积是多少 但我似乎无法做到这一点 如果有人可以提供帮助 我将不胜感激 div class jobFields div class field 1 div div cla
  • AngularJS - 触发控制器时获取先前的路线

    Angular 的内部结构再次让我困惑 我需要在加载特定视图时确定之前的路线 我就是这样做的 app controller TrashCtrl function scope rootScope rootScope on locationCh
  • 使用 Winsock 通过单个 UDP 服务器处理 10 个客户端

    我已经使用 UDP 套接字建立了一个服务器 客户端应用程序 但我的服务器无法一次处理多个客户端 现在我想修改我的应用程序 让 10 个客户端分别运行在不同的计算机上 而我的服务器运行在单独的计算机上 我希望我的服务器能够与 10 个不同机器
  • jquery.ui.touch.punch.js 脚本阻止触摸设备上的输入功能

    我花了一点时间 但我发现我无法单击我的输入 因为我使用 touch punch 脚本在触摸设备上启用 jquery UI 拖动功能 熟悉这个脚本的人知道为什么会这样吗 该表单实际上位于父对象的树中 有谁知道我可以覆盖或强制选择的方法吗 我现
  • 如何通过URL获取RouteData?

    我需要得到RoutData通过 ASP NET MVC 应用程序中给定的 URL 字符串 我找到了我需要嘲笑的方式HttpContextBase基于我的 URL 字符串 然后将其传递给RouteTable Routes GetRouteDa
  • IEEE 754 浮点除法的可逆性

    IEEE 754 浮点除法的可逆性是什么 我的意思是标准是否保证如果double y 1 0 x then x 1 0 y i e x可以一点一点精确还原吗 时的情况y is infinity or NaN都是明显的例外 是的 有 IEEE
  • Delphi 6 表单设置为使用 poDesktopCenter 定位自身,最终出现在“扩展”监视器上

    我有一个 Delphi 6 应用程序 它在主窗体出现后启动向导 向导是一种模态形式 我的一位用户将其 Windows 桌面扩展到了多个显示器 在这种情况下 主窗体显示在主监视器上 向导显示在扩展监视器上 这会造成混乱 因为当他们尝试单击主窗
  • 为什么要将 NSObject 协议附加到协议实现中

    我看到一些类似于以下内容的代码 protocol MyProtocol
  • 如何查找数据框中各组之间共享的值? [复制]

    这个问题在这里已经有答案了 我有一个整洁的 data frame 有两列 exp and val 我想找出哪些值val在所有不同的实验之间共享 df lt data frame exp c A A A A B B B B C C C C v
  • 找不到符号类“Builder”

    我最近下载了Android Studio 我认为它比eclipse 我创建了一个新项目 其中包含登录活动 但该活动似乎有错误 在此处输入图像描述 1 Error 78 31 error cannot find symbol class Bu
  • 递归读取文件夹并对每个文件夹执行命令

    我试图递归到文件夹 然后使用 bash 脚本在它们上运行命令 有什么建议么 如果您想递归到目录 对其中找到的每个文件执行命令 我会使用find我认为 命令 而不是使用 shell 脚本编写任何内容 该命令可以接收很多参数 例如type过滤返
  • XNA Content.Load 如何操作?

    我只是好奇它是否在每次调用时实际上将资源加载到内存中 或者如果它查找它 发现它是否已加载 如果未加载 则加载一次并仅保留引用 以便第二次调用它只是获取对它的引用 它会跟踪已加载的内容 并且如果之前已加载过该对象 则仅返回对同一对象的引用 这
  • OpenCV 和 Python - 图像太大而无法显示

    我的图像尺寸为 6400 3200 而我的屏幕为 1280 x 800 因此 仅需要调整图像大小以供显示 我正在使用 Python 和 OpenCV 2 4 9 根据OpenCV 文档 http docs opencv org 2 4 mo
  • Docker-compose 异常

    溢出 我尝试将 docker compose 脚本从我的 ubuntu 工作站传输到我的 Fedora 笔记本电脑 当击中时 docker compose up 我得到以下异常 polito localhost dev docker com
  • 为什么 Android Studio 无法引用仅包含在 build.gradle 中的库?

    在我的应用程序中 我使用 Guava 库 我在我的文章中引用了它build gradle文件仅如下 dependencies compile com google guava guava 13 0 1 我的应用程序重建并运行良好 然而 当我
  • 使用条件运算符时没有隐式转换[重复]

    这个问题在这里已经有答案了 我有以下课程 abstract class AClass class Foo AClass class Bar AClass 当我尝试使用它们时 AClass myInstance myInstance true
  • 通过拖放到批处理文件上运行命令

    我想将文件拖放到批处理文件上 以便对其运行以下命令 如何在删除的文件上运行命令 PotreeConverter exe
  • 如何在 OpenShift 上部署多模块 Maven Spring Boot 应用程序

    我有一个要部署的多模块 spring boot 项目开放式换档 https www openshift com 我也在那里安装了 Jenkins 源代码托管在 Github 上 每个模块都包含一场战争 以便拥有微服务结构