Maven不值得(还)进行EAR部署吗?

时间:2010-02-09 15:19:21

标签: maven-2 m2eclipse

我正在将几个J2EE项目从Ant移植到Maven2。所有这些项目都包含1个EJB和1个Web模块,并使用推荐的“瘦”EAR打包方法。这意味着EJB和/或Web模块所依赖的JAR都只是放在EAR的根目录中。 EJB和Web模块在各自的清单中都有Class-Path条目来引用特定的JAR,而Web模块Class-Path也将引用EJB jar。

我吓坏了(太强了吗?:))发现Maven不太支持这个。我阅读了关于处理瘦的WAR的官方页面,但这意味着我必须复制EAR pom中的WAR依赖项,更糟糕的是,还有传递依赖项。如果你必须在任何地方手动处理依赖,那么采用Maven似乎毫无意义!

然后我开始谷歌搜索并发现了各种变通方法 - 显然,我不是第一个(a)想要做一个瘦小的EAR和(b)不喜欢Maven建议的方法(它本身就是解决方法)。

我尝试了其中一些方法,但没有一个适合我。我还发现了一些看起来像Maven错误的问题,例如: WAR插件'packagingExcludes'指令只排除直接依赖,而不是任何传递依赖!不是很自信鼓舞人心。我找到了这个特定问题的JIRA问题,但它仍然是开放的。

然后我发现我的命令行Maven 2.2.1对我的m2eclipse嵌入式Maven(Embedder v.3.0)做了不同的事情。我们的开发人员肯定希望从Eclipse驱动Maven,因此依赖最新的命令行版本不是一种选择。

所以,我的问题是:现在,对于可预见的未来,如果我们在Eclipse中进行所有开发并且主要在瘦的EAR项目上工作,是否值得迁移到Maven? Maven的未来有什么能够以更强大和集成的方式处理EAR吗?

3 个答案:

答案 0 :(得分:3)

  

所以,我的问题是:现在,而且   可预见的未来,值得   如果我们全力以赴,就转移到Maven   Eclipse中的开发和工作   主要是在瘦的EAR项目上?是   在Maven的未来有什么   会让它更多地处理EAR   强大而综合的方式?

短篇小说:不,不是在M2Eclipse被打破的情况下。

长篇故事:

目前,我建议反对它,至少在Eclipse中。在撰写本文时,M2Eclipse插件总是有一个非常讨厌的错误,它会生成自己的application.xml描述符文件版本,而不是使用Maven会创建的那个。

不幸的是,这个自定义创建的application.xml是完全错误的:它忽略了finalNames,有一个明显硬编码的“lib /”前缀,并且由于某种原因将EJB JAR分配给扩展名“.ejb”。更糟糕的是,你无法删除它以替换为Maven的版本,因为它不断被M2Eclipse重新生成。

Maven只会生成application.xml(如果它还没有到位)。因为WTP / M2Eclipse生成的application.xml不断重新生成,所以Maven application.xml没有机会。

但是这个问题有一个解决方法:你可以告诉Maven在打包期间忽略application.xml,以便它认为 application.xml不存在,在这种情况下它仍会生成它自己的版本。这样,错误生成的application.xml文件无关紧要。供将来参考:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <version>5</version>
        <earSourceExcludes>**/application.xml</earSourceExcludes>
        <generateApplicationXml>true</generateApplicationXml>
    </configuration>
</plugin>

然而,一个主要问题是用于部署到Eclipse中的GlassFish的Ant脚本生成自己单独的EAR以进行部署,并使用M2Eclipse生成的application.xml来执行此操作。这意味着只要M2Eclipse插件仍然存在,它生成的EAR将始终是错误的。在codehaus JIRA上有关于此的错误报告,但现在无法访问它们。

其他应用程序服务器的YMMV,但要准备好重复使用application.xml。

答案 1 :(得分:1)

  

不幸的是,这个自定义创建的application.xml是完全错误的:它忽略了finalNames,有一个明显硬编码的“lib /”前缀,并且由于某种原因将EJB JAR分配给扩展名“.ejb”。更糟糕的是,你无法删除它以替换为Maven的版本,因为它不断被M2Eclipse重新生成。

你真的确定m2eclipse这样做吗?我正在使用JBoss Tools 3.1,其中包括m2eclipse集成,并准确地说明了你所说的问题。但是,我没有看到m2eclipse关于源application.xml的理由。

我怀疑JBoss Tools会将信息注入application.xml。请证明我错了,我会永远停止使用m2eclipse,它改变了任何不在/目标之下的东西。

// GG

答案 2 :(得分:0)

  

我吓坏了(太强了吗?:))发现Maven不支持这个(...)

实际上,Maven不支持skinny WARs(另请参阅Solving the Skinny Wars problem wiki页面),因为这只是从一开始就没有计划,而且Maven假设有胖的WAR。因此,构建瘦的WAR和瘦EAR的方式确实是在现有插件之上构建的变通方法。而且,是的,这很容易出错。

  

(...)然后我发现我的命令行Maven 2.2.1对我的m2eclipse嵌入式Maven(Embedder v.3.0)做了不同的事情。

请注意,您可以将m2eclipse配置为使用外部Maven而不是嵌入式Maven。这实际上就是我所做的,我想要与CI引擎完全相同的版本。

  

所以,我的问题是:现在,对于可预见的未来,如果我们在Eclipse中进行所有开发并且主要在瘦的EAR项目上工作,是否值得迁移到Maven?

我的建议很简单:如果Maven不支持想要构建软件的方式(合法与否,这不是问题),请不要使用它。