如何在Gradle中指定对Tomcat库的依赖

4
关于我的知识水平背景:我目前正在尝试学习如何使用Gradle构建项目。到目前为止,我对于构建工具几乎没有任何经验。我确实理解了一般的概念,并且以前也看过Ant和Maven文件,但从未自己编写过。至今为止,我仅使用其他人的构建脚本或使用Eclipse配置我的构建。如果我偏离了正确的方向,请指出来。
此外,很遗憾,我没有手动构建jar的经验。
我有一个Eclipse项目,我想将其编译成一个jar包。所需的库jar文件位于我的本地文件系统上。通过Gradle成功使用了这些文件。
dependencies {
    compile fileTree(dir:'lib', include:'*.jar')
}

此外,我的源文件存储在src/main/java目录下,而在build.gradle文件中只是使用了apply plugin: 'java'。通过gradle build构建该项目应该没有问题,但以我目前的了解,该库应该运行在一个Tomcat上,并使用一些由Tomcat提供的库,例如:我正在使用javax.servlet.http.HttpServletRequest

在Eclipse中,该项目可以正常工作,但是需要将Tomcat库添加到Eclipse构建路径中。在Eclipse中,我可以看到javax.servlet.http.HttpServletRequestservlet-api.jar的一部分,该文件是Tomcat库的一部分。

现在,当我构建项目时,由于我没有在依赖项中指定servlet-api.jar,所以Java编译器找不到该类,从而导致构建错误。我猜我可以通过某种方式下载它(或者学习如何将其指定为外部依赖项,使Gradle从某个存储库中下载),但我不确定这是否正确。

有没有办法告诉Gradle使用Eclipse使用的同一库?或其他通用方法来告诉它所有Tomcat库,就像我可以在Eclipse中简单地添加完整的Tomcat库一样?还是说我实际上需要另一个这些库的副本,并且必须逐个进行指定?

另外,我需要将这些库JAR文件添加到我的构建结果库JAR文件中吗?据我所知,我需要将所有我依赖的jar文件添加到生成的jar文件中。但是,我也曾在某处读到过一些库由Tomcat自身提供,因此它们必须成为部署在Tomcat上的任何war文件的一部分。

我很困惑,我不知道如何使用Gradle构建用于在Tomcat 上部署的war文件中的jar文件。希望有人能帮助我理清思路,指导我正确的方向或告诉我如何将包含在Tomcat库中的jar文件添加到Gradle的依赖项中。

1个回答

10

使用Gradle时,无论何时将文件或目录添加为依赖项,它们都不会被视为完整的构件(具有组、名称和版本),而是作为包含类的简单文件处理。这意味着Gradle不会对它们执行任何冲突解决或拉取传递性依赖。

对于您来说,只需要开始,我建议只添加tomcat依赖项。确保它与Eclipse中的版本相同。

apply plugin: 'war'

repositories {
   mavenCentral()
}

dependencies {
    providedCompile 'org.apache.tomcat:tomcat-catalina:7.0.47'
}

此外,还要考虑作为长期解决方案的Eclipse Integration Gradle项目。


谢谢,这已经让我更进一步了。我首先尝试应用Java插件,但像您一样指定了Tomcat依赖项。这不起作用,因为没有war-lugin,依赖关系似乎没有“providedCompile”属性。但是,我不确定是否想要创建war文件。我只需要一个jar文件,以便在其他Web应用程序中用作库。据我所知,war只是一个特殊的jar。因此,在此构建war并在另一个应用程序中使用它作为库是否可以正常工作? - Joachim Kurz
当我使用war-plugin构建时,由于其他类缺失,我会遇到其他错误(这是一种改进;-))。这次似乎缺少了JRE系统库中的类。难道JRE系统库不应该默认包含在依赖项中吗?从某个仓库下载它只是为了使用每次执行代码时都会存在的一些类似乎是错误的。 - Joachim Kurz
@JoachimKurz,您能否更新您的问题并附上错误信息?JRE库应该包含在JVM类路径中,而不是WAR中。看起来您有一些常规的配置问题。您是否尝试创建一个新的Tomcat项目来复制这个问题? - kukido
经过一番尝试,我发现只剩下一个错误,提示找不到@Nullable。由于我只在一个地方使用了该注释,并且它并不是必需的,所以我暂时将其删除了,现在它可以正常工作了。我猜测这个错误是由于Eclipse和gradle使用不同的JRE版本造成的,但我没有深入研究它。 - Joachim Kurz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接