【问题标题】:Gradle 'Provided' dependency for Java pluginGradle 为 Java 插件提供的依赖项
【发布时间】:2012-08-31 08:35:24
【问题描述】:

我正在尝试编译几个 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 的 bug tracking 上发现了很多关于这个确切问题的讨论:Gradle-784

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

我在 SO 上找到的最有希望的链接,但不幸的是,我无法让示例也能正常工作:SO Provided Question 值得注意的是 Stack Overflow 问题最有希望的那一行:

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

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

【问题讨论】:

标签: java gradle


【解决方案1】:

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

apply plugin: 'war'

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

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

【讨论】:

  • 这就是我真正想要的概念。但要注意,我为提供的编译添加了一个配置,但没有使用 war 插件。我试图在 Java JAR 中获得与 WAR 相同的功能。有人建议使用 WAR 插件,启用 jar.enabled,然后删除 WAR。这是我们目前正在做的事情,但是提供的依赖项在之后创建的 JAR 中。
  • 我想说:不要与工具作斗争。
【解决方案2】:

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

sourceSets.main.compileClasspath += configurations.providedCompile

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

sourceSets.test.compileClasspath += configurations.providedCompile

【讨论】:

  • 我试过了,意识到我确实忘记将它放入测试中,但我仍然得到:java.lang.NoClassDefFoundError 原因:java.lang.ClassNotFoundException 正在寻找那个 JAR文件。关于我发现它提供了编译扩展的 gradle 解决方案,有什么我应该知道的吗?该解决方案似乎有效,JAR 不在生成的 WAR 中,所有测试都在正确编译。
  • 没有更多信息,我无法说出问题所在。这个解决方案对我有用。如果你只是做configurations.compile.extends configurations.provided,我认为提供的依赖最终会在战争中结束(没有额外的对策)。
【解决方案3】:

您可以在“jar”模块中使用 compile 范围,在“war”模块中使用 providedCompile

War 的 providedCompile 范围将覆盖 jar 的 compile 范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多