java - 迁移到具有多模块的maven

标签 java maven

我目前正在将一个项目从 Ant 迁移到 Maven 3,同时进行 JBoss AS7/Wildfly 迁移。

我现在在某些客户端特定配置方面遇到问题。

我创建了一个带有父 pom 的多模块项目,如下所示:

Parent
  |___ Business
  |___ Ear
  |___ Ejb
  |___ Sar
  |___ War
  |___ GUI
  |...

这个项目应该配置、调整并交付给不同的客户(目前,我只为一个客户执行此操作)

因此,在所有不同的项目级别(EJB、GUI、Core...)中都存在特定于客户端的代码(EJB、域类、特定 GUI)和特定于客户端的配置。

在之前的配置中,客户端有一个具有 Ant 构建的项目,负责打包、所有不同模块中的资源替换。

我采用了不同的方法,我现在为特定于客户端的模块创建了客户端模块,几乎涵盖了所有模块。

Parent
  |___ ... previous modules...
  |___ ...
  |___ Business-Client1
  |___ Ear-Client1
  |___ Ejb-Client1
  |___ Sar-Client1
  |___ War-Client1
  |___ GUI-Client1
  |...

所有*客户端模块都对其“正常”对应模块有显式依赖。

这些模块打包后,就会部署在 JBoss 实例上。

现在回答我的问题:

  • 我采取的方法是否正确,是否有更简单/更“专业”的方法来执行此操作(配置文件、装配???)?

  • 我必须使用客户端的配置覆盖/更改“正常”模块中存在的一些配置。考虑到客户端模块与其对应模块有依赖关系,因此 Maven 按该顺序打包它们,我该如何做到这一点?

编辑:

将“核心”项目重命名为“业务”,以便我可以讨论核心项目和客户端模块。

到目前为止,我得到了一个工作核心项目,该项目已使用 jboss-as-maven-plugin 正确部署到 JBoss。

我有一个 EAR,其中包含 SAR、WAR 和 EJB 模块。

每个模块都有一个对应的客户端。我认为这有点重,但它更“模块化”......

以下是项目架构的一些说明:

GUI 检测类路径中是否存在实现CustomInitialization 接口(interface)的某个类。

这是我们可以获得客户端特定 GUI 或 EJB 的中心点。例如,菜单被覆盖:

IMenu
  ^
  |
StdMenu
  ^
  |
ClientMenu

因此我们可以为菜单提供自定义 GUI,从而拥有新的屏幕等等。

对于EJB部分来说,这是类似的。在 ClientAction 中,我们可以调用 ClientEjb,该 ClientEjb 可以是全新的,也可以只是扩展核心 EJB。

这对于模型(数据库)、配置和资源来说是相同的。大多数时候,配置文件只是在客户端代码中复制并使用客户端特定配置进行扩展,因此不需要真正合并它们,而只需覆盖它们。

以下是父 pom 目前描述的模块:

<modules>
    <module>ejb</module>
    <module>web</module>
    <module>ear</module>
    <module>util</module>
    <!-- Core contains the business model -->
    <module>core</module>
    <!-- Forget those two now -->
    <module>agentManager</module>
    <module>agent</module>
    <!-- service is SAR, maybe i won't need to overwrite that one -->
    <module>service</module>
    <module>gui</module>
    <!-- I am using a client.module variable... -->
    <module>gui-${client.module}</module>
    <module>ejb-${client.module}</module>
</modules>

编辑2:

回应工程师多勒里:我确实不需要合并所有内容,事实上我不确定我需要这样做,我已经考虑过它,我认为我唯一要做的真正的事情是覆盖配置和资源

  • 我不完全确定如何正确执行此操作,因为客户端模块是在核心模块之后打包的。

注释: 对我来说,这种方法的唯一缺点是它需要很多模块来满足客户端代码的特殊性。

顺便说一下,GUI 模块是一个重客户端,不需要合并,因为它作为 jnlp 文件部署在服务器上(由客户端配置覆盖并由 WAR 模块交付)。

最佳答案

使用 Maven 的优点和缺点是,它们的做事方式往往受到一群人认为正确的方式的限制。就我个人而言,我确实更喜欢 Maven 方式,但如果我必须处理现有应用程序的迁移,而该应用程序一开始就没有考虑过,我会从 ant run 插件开始,将内容导入到 ant 并使用 maven 程序集插件来设置要发布的部分。

如果您更喜欢编程方法,另一种方法是从 Gradle 开始。我个人会避免它,因为它会让其他人在未来更难升级,因为它变得非常特定于项目,尽管第一个人更容易做到这一点。

客户端 JAR 通常位于其自己的项目中,与 EJB 和 WAR 模块分开。

尽管如果这是一个 Java EE 6 及更高版本的项目,我会消除 EJB 模块并在适用时将它们合并到 WAR 中。但是,这需要对您的项目进行更详细的分析。

如果客户端代码是从服务器代码“生成”的,那么项目应该会更简单,在我的例子中,我使用了 a separate project that just uses the plugin and no versioned source aside from tests .

关于java - 迁移到具有多模块的maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807136/

相关文章:

java - 使用 getParent() 在 CardLayout 中的卡片之间切换

java - System.out.println 是否有可能是导致 java 应用程序挂起的原因?

Eclipse - 转换为 Maven 项目

java - Jmeter测试使用maven运行

java - 如何找出给定的字符串已经在 J​​ava 字符串池中?

java - Android 中 webview 上的 OnClick?

java - CompletableFuture.allOf().orTimeout() 的意外行为

maven - 在不下载的情况下确定远程仓库中是否存在 Artifact

Maven选择不一致版本的间接依赖: why,以及如何防止?

maven - 如何从 docker 运行 Maven 包装器?