0

所以首先,有一点背景。

我正在将 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.5。编译我们的通用代码需要tomcat-jdbc JAR。servlet-api-2.5 JAR 实际上只是vaadin-client-compiler的传递依赖。我已经在我们的 Web 项目中删除了对vaadin-client-compiler的依赖,因为它似乎没有必要,但看起来它仍然被 Gradle 的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 的主要区别似乎是我们的依赖项现在是从存储库加载的,而不是直接在源中链接。

任何帮助是极大的赞赏。

4

1 回答 1

2

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

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

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

于 2014-06-10T15:39:53.960 回答