12

我正在尝试编译几个 WAR 文件,所有这些文件都依赖于一个通用的 JAR 模块。然而,在我的 Gradle 构建中,我似乎无法获得类似“已提供”的依赖项来使用 Java 插件。

我的编译看起来像这样:

apply plugin: 'java'
configurations{
    providedCompile
}

dependencies {
    compile module("org.springframework.amqp:spring-amqp:${springAmqpVersion}")
    compile module("org.slf4j:slf4j-api:${slf4jVersion}")
    compile module("org.slf4j:slf4j-ext:${slf4jVersion}")

    providedCompile "javax.servlet:servlet-api:${servletApiVersion}"

    runtime module("org.slf4j:jcl-over-slf4j:${slf4jVersion}")
    runtime module("org.slf4j:jul-to-slf4j:${slf4jVersion}")
    runtime module("org.slf4j:log4j-over-slf4j:${slf4jVersion}")

    sourceArchives module("org.springframework.amqp:spring-amqp:${springAmqpVersion}:sources")
    sourceArchives module("javax.servlet:servlet-api:${servletApiVersion}:sources")
}


sourceSets {
    main { compileClasspath += configurations.providedCompile }
}

但是,最后一点是异常的地方。我曾尝试在运行时依赖项扩展它之后将 servlet-api(由 Tomcat 提供)添加到配置中,或者只是将其作为编译模块放入,然后稍后将其从运行时依赖项中删除。

我尝试了几种不同的方式来修改依赖项,我最接近的结果是:

newRuntime = configurations.runtime.minus(configurations.providedCompile)
configurations.runtime = newRuntime

然而,最后一点将生成具有适当依赖关系的变量newRuntime,但是当我尝试将变量重新分配回运行时配置时,它会引发“找不到属性异常”

我在 Gradle 的错误跟踪中发现了很多关于这个确切问题的讨论:Gradle-784

然而,主要的线索来自 Spring,他使用 Maven 和他们的 gradle 构建,我不熟悉。

我在 SO 上找到的最有希望的链接,但不幸的是,我无法让这些示例也能正常工作:SO 为 Stack Overflow 问题提供了注释问题,该行显示出最有希望的行:

//Include provided for compilation
sourceSets.main.compileClasspath += configurations.provided

此行不会像其他尝试一样给出错误,但是似乎providedCompile(提供的我的版本)依赖项实际上并未放在编译类路径中,因为尝试编译时出现类路径错误。

4

3 回答 3

5

我不是 100% 关注您的消息,但提供编译只允许用于“战争”插件。

apply plugin: 'war'

dependencies {
  // others go here
  providedCompile "javax.servlet:javax.servlet-api:${servletVersion}"
}

在“战争”步骤期间,不包括 servlet jar。

于 2012-09-06T13:52:59.130 回答
5

您已经添加了一个providedCompile配置,但您没有对它做任何事情。因此它不会出现在任何类路径上。要将配置放在主编译类路径上,您可以执行以下操作:

sourceSets.main.compileClasspath += configurations.providedCompile

同样,将其放在测试编译类路径中:

sourceSets.test.compileClasspath += configurations.providedCompile
于 2012-09-06T15:59:34.647 回答
3

您可以在“jar”模块中使用编译范围,并在“war”模块中使用providedCompile 。

War 的providedCompile范围将覆盖 jar 的编译范围。

于 2014-01-23T15:30:35.023 回答