使用多个模块迁移到maven

时间:2014-07-17 15:02:34

标签: java maven

我目前正在将项目从Ant迁移到Maven 3以及JBoss AS7 / Wildfly迁移。

我现在遇到一些特定于客户端的配置问题。

我创建了一个像父pom一样的mutli-module项目:

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
  |...

所有*客户端模块都明确依赖于他们的'普通'couterpart。

一旦打包这些模块,它们就部署在JBoss实例上。

现在提出我的问题:

  • 我采取了正确的方法,是否有更简单/'mavenlier'的方法(配置文件,汇编???)?

  • 我必须使用客户端的配置覆盖/更改“普通”模块中的某些配置。考虑到客户端模块与对应模块有依赖关系,我怎么能这样做,因此maven按顺序打包它们?

编辑:

将'Core'项目重命名为Business,以便我可以谈论核心项目和客户端模块。

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

我有一个包含SAR,WAR和EJB模块的EAR。

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

以下是项目架构的一些解释:

gui检测类路径中是否存在实现CustomInitialization interface的某个类。

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

IMenu
  ^
  |
StdMenu
  ^
  |
ClientMenu

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

对于EJB部分,这是类似的。在ClientAction中,我们可以调用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:

回应工程师Dollery:我确实不需要合并所有东西,事实上我并不确定我需要,我已经考虑过了,我认为我唯一真正需要做的就是覆盖配置和资源

  • 我不完全确定如何正确地做到这一点,因为客户端模块在核心模块之后被打包。

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

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

1 个答案:

答案 0 :(得分:1)

使用Maven的优点和缺点是,他们倾向于根据一群人认为合适的事情而采取非常有限的做事方式。我个人更喜欢Maven的方式,但是如果我必须处理现有应用程序的迁移,而这个应用程序在思考开始时并没有被编组,我会从ant run插件开始,只需将内容导入到ant并使用maven程序集插件,用于设置要发布的部分。

如果您更喜欢编程方法,另一种方法是从Gradle开始。我个人会避免这种情况,因为它会使得将来更难以为其他人提供帮助,因为它变得非常具体项目,即使第一个人更容易做到这一点。

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

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

如果客户端代码是&#34;生成&#34;从服务器代码来看,项目应该更简单,在我的例子中我使用了a separate project that just uses the plugin and no versioned source aside from tests