如何在 Eclipse 中处理 Maven WAR 覆盖?
Posted
技术标签:
【中文标题】如何在 Eclipse 中处理 Maven WAR 覆盖?【英文标题】:How to handle Maven WAR overlays in Eclipse? 【发布时间】:2012-01-19 10:47:59 【问题描述】:我有一个使用 WAR 覆盖的多模块 Maven 项目(堆栈深度为 3)。在 Maven 中一切正常,但我无法从 Eclipse 中启动我的 WAR,因为它抱怨找不到各种文件。
如何配置 Eclipse(和启动器)以便我可以从 Eclipse 运行我的 WAR,而无需先进行 Maven 安装?我应该补充一点,我的 Eclipse WAR 项目不是动态 Web 项目……这是我需要做的一部分吗?
注意:以下问题涉及该主题,但答案表明您必须始终先进行 Maven 安装,我知道这是不对的,因为有些人在没有 Maven 的情况下使用 Eclipse。
Maven overlays and Eclipse
我也发现了这一点,这让我觉得通过原版 M2E 是不可能的:
http://jira.codehaus.org/browse/MNGECLIPSE-599
【问题讨论】:
【参考方案1】:我能够做到这一点,一切都很好。这是做什么:
首先,您需要 M2E Eclipse 插件,它是 Eclipse 自动识别和更新 Maven 依赖项所必需的。它还提供了一个不错的图形化 POM 编辑器。截至 2011 年底,M2Eclipse 项目由 Sonatype 捐赠给 Eclipse 基金会,现在简称为M2E。但是,Eclipse Indigo 的 Java EE 版本仍然没有附带它,必须通过他们的更新站点单独安装
http://download.eclipse.org/technology/m2e/releases过去,Eclipse 和 Maven 的集成有些麻烦。然而,这个新的基于 Eclipse 的 Maven 集成现在意识到在 POM 文件中使用了许多 Maven 插件,并且只有某些插件的某些目标在 IDE 环境中才有意义。此外,在 IDE 中运行时有意义的目标可能需要特殊配置。为了正确处理这个 M2E,现在支持“连接器”的概念
M2E 有一长串特殊的连接器,允许它在调用各种 mojo(Maven 插件目标)时做“正确的事情”。要查看 Eclipse 中可用连接器的列表,请转到 Preferences 对话框并选择 Maven->Dicovery->Open Catalog。这些连接器应该在项目导入期间在 pom.xml 文件中检测到时自动安装。但是,这需要正确版本的 M2E Maven 导入向导(Indigo 在 SR2 之前没有)。
此外,有时这些连接器有问题,我们需要使用每晚或 beta 更新站点来获取最新修复。如果您的版本较旧或有问题,则需要在升级后删除并重新导入项目。由于这些原因,在我看来,所有 M2E 连接器都应该在将项目导入 Eclipse 之前手动安装。
M2E-WTP 连接器是使 WAR 覆盖在 Eclipse“服务器”的 Eclipse 启动器中工作所需的连接器。该连接器用于将 Maven 与 WTP...作为项目导入 Eclipse。
m2e-wtp 连接器的更新站点是:http://download.jboss.org/jbosstools/updates/m2eclipse-wtp/
添加此 M2E-WTP 站点并安装连接器。但是请注意,M2E 和 M2E-WTP 连接器都不会将覆盖 WAR 的依赖项放入最终的 WAR 中。您必须通过将所需的依赖项添加到最终的 WAR pom.xml 来做到这一点。我不知道为什么这些工具不这样做,但他们没有——所以克服它吧。 ;-)
此时,我还建议通过 Help->Check for Updates 进行完整更新。完成此操作后,您应该可以简单地添加一个 Eclipse 服务器,单击您的项目(不是覆盖项目,而是常规项目)并选择“在服务器上运行...”。
对 WAR 或覆盖 WAR 所做的更改将自动发布到您的服务器。无需重新启动服务器即可发布 javascript 更改...您只需在浏览器中点击刷新即可查看新代码正在运行。
第二次更新:M2E 中存在一个错误 (https://issues.sonatype.org/browse/MECLIPSEWTP-174),可能导致 WEB-INF/lib 目录意外丢失其所有 JAR 文件。发生这种情况时,您的 servlet 应用程序显然不会启动。解决方法是通过右键单击服务器并选择“清理”来清理服务器。请注意,单独清理工作目录不会恢复这些丢失的 JAR。
【讨论】:
很高兴我找到了这个答案。但这对我不起作用。我尝试了一个非常简单的案例:简单的战争项目 A,简单的战争项目 B,并且 pom A 将战争 B 声明为依赖项,但实际上并没有使用 B 中的任何类——在这种情况下,mvn install
运行成功,覆盖项目 B 按预期添加到战争 A。但是,如果我在项目 A 中添加对 B 类的一些引用,我会看到两个问题:(1)eclipse 无法解析对 B 类的引用。(2)mvn install
(来自 eclipse 或来自命令行)失败并出现代码 A 中我从 B 引用类的每个地方都出现编译错误。
按照您的建议安装连接器并不能解决这些问题。我在这里错过了什么?
"但是请注意,M2E 和 M2E-WTP 连接器都不会将覆盖 WAR 的依赖项放入最终的 WAR"。我有这个确切的问题,你知道任何其他解决方法。您提供的那个不适用于我的情况。
你会讨厌这个,但我最终做的是创建另一个 Maven 模块,在 WAR 打包之前将所有依赖项拉到一个 JAR 中。是的,这是一个笨拙的解决方法,但在过去的一年里一直在成功地工作。以上是关于如何在 Eclipse 中处理 Maven WAR 覆盖?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Eclipse 将 Maven 项目的 WAR 部署到 JBoss 服务器?
如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?