如何在 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 服务器?

eclipse中maven项目如何部署到tomcat

如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?

如何从 Eclipse 在 Tomcat 中运行 Maven 项目

如何在Eclipse中制作war文件[重复]

eclipse打包web工程为war包时,它是不是包含了项目引用的jar包?如果不是,可以一起打包进来么?谢谢