我目前正在将项目从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模块提供)。
答案 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。