如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?
Posted
技术标签:
【中文标题】如何将 maven 托管依赖项复制到 war\\web-inf\\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?【英文标题】:How do I get maven managed dependencies copied into war\web-inf\lib so I can run my GWT 2.0 app in debug mode within Eclipse?如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序? 【发布时间】:2011-01-01 19:16:35 【问题描述】:我正在将现有项目从 GWT 1.5.2 更新到 GWT 2.0.0。我们使用 maven 2 来管理我们的依赖关系并在 Eclipse 3.5 中进行所有开发。
因为我们使用 maven 来管理我们的依赖项,所以我没有像 GWT 指定的那样在 war\web-inf\lib 目录中拥有所有这些 jar。相反,它们位于 maven 存储库中,正是 maven 喜欢它们的地方。我已经设置了项目,以便 maven 可以在 dev 或 web 模式下成功构建和启动,并且应用程序可以正常运行。
问题是当我从 Eclipse 启动时,我得到一个 java.lang.NoClassDefFoundError。如果我在启动之前手动将我的依赖项复制到 war\web-inf\lib 中,一切都会运行良好,但这并不适合长期解决方案。首先,如果我将所有这些 jar 文件检查到我们的版本控制中,那将颠覆我们从 maven 获得的大部分价值。尽管 maven 很烦人,但放弃它并不是答案。其次,让开发人员在每次想要调试某些东西时手动复制它们是荒谬的。
那么我可以让 Eclipse 在启动之前将依赖项复制到 war\web-inf\lib 中吗?是否有我缺少的替代解决方案?
谢谢,
托尼
【问题讨论】:
【参考方案1】:如果您将 pom.xml 中的打包方法设置为 war,它应该将运行时依赖项复制到 target/war/WEB-INF/lib。
或者您的项目是要建造像耳朵这样更大的东西?如果是这样,您可能应该将您的 pom.xml 拆分为多项目格式。
至于 Eclipse,我对它不是很熟悉,所以我无法真正帮助您。当你运行或调试时,你(或者你能)运行一个 maven 目标(比如“安装”)吗?
【讨论】:
【参考方案2】:您应该安装m2eclipse plugin 并使用它在eclipse 中构建您的项目。这将从 eclipse 中调用 maven 作为外部工具。
您的 maven 项目工件类型应设置为 war,这将让 maven 发现依赖项并捆绑它们。
查看以下链接:
force Maven2 to copy dependencies into target/lib
http://maven.apache.org/plugins/maven-war-plugin/
http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html
【讨论】:
我在 Eclipse 中添加了 m2eclipse 插件,但这似乎让 Eclipse 屈服了。它现在在启动时卡住了“更新 maven 依赖项”。一旦我安装并运行了一个新的 Eclipse,我会试一试。 本地 maven 存储库可以缓解依赖更新问题。我强烈建议您设置 Nexus nexus.sonatype.org 的实例并将您的 maven 设置设置为使用 mirrorOf=* -> 您的本地 nexus 存储库。初始更新需要一些时间,但此后您团队的其他成员将下载本地缓存的工件,这对您、您的团队、公共 maven 存储库和互联网的其他成员都有好处。 m2eclipse 插件肯定会让你的生活更轻松。它查找项目之间的引用并通过 Eclipse 链接它们,因此您不必在每次修改依赖项目时都去命令行重建快照。它还为您创建类路径并使其与 pom 文件保持同步。我看到的唯一问题是有时它不会拉下新的依赖项,因此当您添加不在本地存储库中的新依赖项时,您必须从命令行执行“mvn dependency:resolve”。 【参考方案3】:这应该不是问题。如果您使用的是 Eclipse+WTP,那么 WTP 允许您声明项目属性中“J2EE 模块依赖项”下列出的 jar。这些 jar 会自动发布到 tomcat(请参阅本评论末尾的注释) 您需要在 Eclipse 环境中声明一个 M2_REPO 变量(在 Eclipse 帮助中搜索“类路径变量”),它应该指向您的本地 Maven 存储库,然后将外部 jar 从那里添加到您的项目中并将它们标记为“J2EE 依赖项”。 我用大量的项目做到了这一点,Maven 和 Eclipse 并排生活:)(没有 m2eclipse)
第二个选择是尝试将 Eclipse 和 Maven 与 m2eclipse 插件集成,正如 Crowne 提到的,但我发现这没有必要。
如果您不使用 WTP(但您应该使用),还有第三种选择。假设您使用的是 tomcat,那么您可以将这些 jar 复制到 $(tomcat.home)/common/lib。如果您可以仅针对您的私有 Tomcat 实例(在每个开发人员的机器上)执行此操作,那么您就可以开始了。 这应该是一个低影响的解决方案,可以在运行时将这些 jar 放入类路径,但它不能很好地扩展。
注意:不幸的是,Eclipse Web 项目的类路径可能会令人困惑。当您将 jars 添加到项目的常规构建路径时,它们不会部署(复制)到 tomcat。为了解决这个问题,WTP 定义了一个名为 Webapp Library 的特殊库——这个库包含项目的 WEB-INF/lib 文件夹中的所有 jar,以及所有标记为 J2EE Module Dependencies 的外部 jar。当发布到 tomcat 时,所有这些 jar 都会找到适合 WEB-INF/lib 的方式。
【讨论】:
【参考方案4】:运行gwt:eclipse
目标会将maven 依赖项复制到war/WEB-INF/lib
。请参阅Maven GWT plugin 的Eclipse IDE Integration 文档的Eclipse 配置 部分了解更多详细信息。还请查看 this answer 关于 Maven GWT 2.0 和 Eclipse。
【讨论】:
【参考方案5】:一个支持 maven 的 IDE(idea、eclipse、netbeans)应该自动完成这个打包。也许你:
忘记在 IDE 中启用 maven 导入? 没有将这些依赖项添加到 pom.xml 中(因此它们不包含在“mvn 包”阶段) 在依赖声明中添加了错误的范围(例如,范围“提供”或“测试”),因此它们在运行时被忽略【讨论】:
【参考方案6】:很简单: 1. 在您的项目下创建一个“lib”文件夹,如下所示: "\src\main\webapp\WEB-INF\lib" 2. 复制您想要包含在您的 WAR 包文件夹中的所需“jars”等。 3. 像往常一样调用您的 Maven 构建。我使用“mvn install”,它创建构建了war文件。
如果您检查 WAR 文件,您在步骤 1 和步骤 2 中包含的 jar 将在那里。
干杯。
【讨论】:
这没有帮助。如果您阅读了问题的第三段,我会解释为什么您的答案的第 2 步对我不起作用。以上是关于如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用maven依赖插件将类型为pom的依赖项复制到一个位置