所以首先,有一点背景。
我正在将 Eclipse Java Web 项目转换为 Gradle。我们使用 Vaadin 框架,目前使用 Ant/Maven/Ivy 管理项目。我们有另一个项目,其中包含 Web 项目所依赖的公共代码。在这两个项目中,我们的库文件 JAR 都简单地包含在源代码中并提交给我们的 VCS。随着切换到 Gradle,我们将使用从存储库中提取依赖项的首选方法;主要是 Maven 中心。
我已经完成了与我们当前的 Ant 构建脚本相对应的 Gradle 构建脚本的创建。我为每个项目都有一个 Gradle 构建脚本,以及一个用于配置注入的根目录以及设置文件。我为这两个项目使用了java和eclipse插件,另外还为 web 项目使用了war和vaadin插件。
现在来解决问题。当我使用 Gradle 构建 WAR 时,它可以完美运行,并且WEB-INF/lib目录仅包含我期望的 JAR,基于依赖配置。但是,当我在 Eclipse 中使用 Tomcat 发布项目时,我最终会在WEB-INF/lib目录中得到一堆额外的 JAR 。大多数 JAR 是无害的,只是不必要的,这就是我将它们从 WAR 中排除的原因,但是有一些实际上是有问题的,因为 Tomcat 已经有了它们。在一种情况下,它只是忽略了 JAR,我得到了通常的消息:
[Tomcat] validateJarFile(*) - jar 未加载。
在另一种情况下,我实际上在控制台中收到异常,即使应用程序似乎可以正常工作,这也很麻烦。我还注意到与testCompile配置相关的所有依赖项也正在发布,这看起来确实不对。
确切的违规 JAR 是tomcat-jdbc和servlet-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 的主要区别似乎是我们的依赖项现在是从存储库加载的,而不是直接在源中链接。
任何帮助是极大的赞赏。