【问题标题】:Eclipse/Tomcat publishing unnecessary/problematic dependenciesEclipse/Tomcat 发布不必要的/有问题的依赖项
【发布时间】:2014-07-30 06:06:18
【问题描述】:

所以首先,有一点背景。

我正在将 Eclipse Java Web 项目转换为 Gradle。我们使用 Vaadin 框架,目前使用 Ant/Maven/Ivy 管理项目。我们有另一个项目,其中包含 Web 项目所依赖的公共代码。在这两个项目中,我们的库文件 JAR 都简单地包含在源代码中并提交给我们的 VCS。随着切换到 Gradle,我们将使用从存储库中提取依赖项的首选方法;主要是 Maven 中心。

我已经完成了与我们当前的 Ant 构建脚本相对应的 Gradle 构建脚本的创建。我为每个项目都有一个 Gradle 构建脚本,以及一个用于配置注入的根目录以及设置文件。我正在为这两个项目使用 javaeclipse 插件,另外还为 web 项目使用 warvaadin 插件.

现在解决问题。当我使用 Gradle 构建 WAR 时,它可以完美运行,并且 WEB-INF/lib 目录仅包含我期望的 JAR,基于依赖配置。但是,当我在 Eclipse 中使用 Tomcat 发布项目时,我最终会在 WEB-INF/lib 目录中得到一堆额外的 JAR。大多数 JAR 是无害的,只是不必要的,这就是我将它们排除在 WAR 之外的原因,但有一些实际上是有问题的,因为 Tomcat 已经有了它们。在一种情况下,它只是忽略了 JAR,我得到了通常的消息:

[Tomcat] validateJarFile(*) - jar 未加载。

在另一种情况下,我实际上在控制台中收到异常,即使应用程序似乎可以正常工作,这也很麻烦。我还注意到与 testCompile 配置相关的所有依赖项也正在发布,这看起来确实不对。

确切的违规 JAR 是 tomcat-jdbcservlet-api-2.5tomcat-jdbc JAR 是编译我们的通用代码所必需的。 servlet-api-2.5 JAR 实际上只是 vaadin-client-compiler 的传递依赖。我已经在我们的 web 项目中删除了 vaadin-client-compiler 的依赖项,因为它似乎没有必要,但看起来它仍然被 vaadin 插件。但是,在这两种情况下,我都使用 war 插件的 providedCompile 配置将它们排除在 WAR 之外。

所以我的问题是,如何防止 Tomcat/Eclipse 发布这些 JAR? Gradle 和 Tomcat/Eclipse 是如何通信的,或者它们是如何通信的?据我所知,Gradle 和 Tomcat/Eclipse 似乎只能通过 .classpath 进行间接通信,而 Gradle 的 eclipse 插件会对其进行修改。另外,我尝试了 Gradle 的 eclipse-wtp 插件。它似乎没有解决问题,因为有问题的 JAR 仍在被复制。实际上我什至不确定我是否需要使用这个插件,或者我是否可以简单地使用 eclipse 插件。

我还应该补充一点,我确实通过 Eclipse Marketplace 安装了 Gradle Integration for Eclipse“插件”。我使用了它添加的 Configure -> Convert to Gradle Project 选项以及它提供的 Gradle -> Refresh Dependencies 功能。除此之外,我发现它有点问题,所以我主要通过命令行运行 Gradle。

下面是在我的机器上运行gradle -v的输出:

------------------------------------------------------------
Gradle 1.10
------------------------------------------------------------
Build time:   2013-12-17 09:28:15 UTC
Build number: none
Revision:     36ced393628875ff15575fa03d16c1349ffe8bb6
Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy:          2.2.0
JVM:          1.8.0_05 (Oracle Corporation 25.5-b02)
OS:           Mac OS X 10.9.3 x86_64

如果需要进一步说明,请告诉我。我认为我一定是做错了什么或缺少一些配置,因为我的情况肯定很常见。许多开发人员在 Eclipse 中使用 Tomcat 在本地测试 Web 应用程序,并且随着 Gradle 的流行,如果有人以前没有遇到过这种情况,我会感到惊讶。就 Tomcat/Eclipse 而言,我们切换到 Gradle 的主要区别似乎是我们的依赖项现在是从存储库加载的,而不是直接在源中链接。

非常感谢任何帮助。

【问题讨论】:

    标签: eclipse gradle vaadin7 embedded-tomcat-7 gradle-eclipse


    【解决方案1】:

    但是,当我在 Eclipse 中使用 Tomcat 发布项目时,我最终会在 WEB-INF/lib 目录中得到一堆额外的 JAR。大多数 JAR 是无害的,只是不必要的,这就是我将它们从 WAR 中排除的原因,但是有一些实际上是有问题的,因为 Tomcat 已经有了它们。

    这是 gradle eclipse 工具的一个已知问题。问题是它不了解“提供”范围的依赖关系。有关详细信息,请参阅此问题: https://issuetracker.springsource.com/browse/STS-2380

    有解决此问题的方法。可以通过您在首选项中指定的正则表达式列表全局排除一些“导致问题”的常见依赖项。打开菜单“窗口 >> 首选项 >> Gradle >> WTP”。在那里您可以添加将用于从“部署程序集”中排除 jar 的正则表达式。

    【讨论】:

    • 非常感谢您的回答!巧合的是,在看到您的回复前几个小时,我自己也遇到了这个问题。也感谢您将问题联系起来,很高兴知道我不是唯一一个遇到似乎非常常见且至关重要的问题的人。我尝试了排除列表,它似乎确实有效;第一次,然后它似乎回到仍然部署有问题的 JAR。我似乎无法让它始终如一地工作。我应该使用 eclipse-wtp Gradle 插件还是只使用常规的 eclipse Gradle 插件?有没有办法刷新部署?
    • “eclipse-wtp”项目。该插件旨在与 Eclipse WTP(“Web 工具平台”)集成。实际上,如果您使用此插件,最好禁用“依赖管理”。这使得 gradle 工具更加“放手”,只依赖于 gradle 'eclipse' 任务生成的任何东西。问题实际上是通过工具生成的类路径无法区分“提供的”依赖项。可能是“eclipse-wtp”插件正确处理了它。
    • "有没有办法刷新部署?"不确定是否会起作用,但通常 gradle 菜单“全部刷新”应该刷新所有项目设置,就像您进行了“新鲜”导入一样。
    • 抱歉耽搁了。我似乎仍然无法始终将有问题的 JAR 从部署中排除。据我了解,这个排除列表应该可以解决问题。当我告诉它发布项目时,嵌入式 Tomcat 实例是否可能没有考虑该列表?
    • 该列表应该会影响“component.xml”文件。这是一个日食的事情。我认为在“Gradle >> 全部刷新”时应该将“过滤器”应用于组件程序集(项目中的 component.xml 文件)。如果不是,那么我会考虑该错误,您可能应该在 STS 问题跟踪器 (issuetracker.springsource.com/browse/STS) 中提出错误报告
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2015-09-21
    • 2013-02-16
    相关资源
    最近更新 更多