【问题标题】:How to exclude specific jars from WEB-INF/lib如何从 WEB-INF/lib 中排除特定的 jar
【发布时间】:2014-04-17 04:18:03
【问题描述】:

我有以下 gradle 项目:

jar-module-A
  +-- JavaEE lib(Dependency)

war-module-A
  +-- jar-module-A

我想从 WEB-INF/lib 中排除 JavaEE lib。

  1. 使用提供的编译:

    由于 jar-module-A 不是 web 模块而是 jar,我不能在 jar-module-A 的 build.gradle 中使用 providedCompile。

  2. 配置 { runtime.exclude JavaEE-lib }

    它不仅将 JavaEE 排除在运行时之外,还排除了 testRuntime,它通过 ClassNotFoundException 使我在 war-module-A 中的单元测试失败。

如何缓解这种情况?

【问题讨论】:

  • providedRuntime 不是您要找的吗?
  • 感谢您的快速回复。 providedRuntime 是一个战争插件的方法以及providedCompile。所以我不能在 jar 项目中使用它...
  • 啊..当然。那么您能否提供一个示例 gradle 构建文件来说明问题并让其他人尝试一下?
  • 当然。我在github.com/ruimo/gradle-sample 放了一个样品。
  • 在module_a中,执行gradle uploadArchives。然后在module_b中,执行gradle test assemble。

标签: gradle


【解决方案1】:

蛮力解决方案是:

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'maven'

repositories {
  mavenCentral()
  maven {
    url "file:///tmp/repo"
  }
}

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: "file:///tmp/repo")
    }   
  }
}

dependencies {
  compile group: 'ruimo', name: 'module_a', version: '1.0-SNAPSHOT'
  testCompile group: 'junit', name: 'junit', version: '4.10'
}

war {
    classpath = classpath.filter {
        it.name != 'javaee-api-6.0.jar'
    }   
}

module_b。它可能取决于文件名(不确定)。也许稍后会看看,但不确定 - 时间很短。

更新

更复杂:

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'maven'

repositories {
  mavenCentral()
  maven {
    url "file:///tmp/repo"
  }
}

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: "file:///tmp/repo")
    }
  }
}

dependencies {
  compile(group: 'ruimo', name: 'module_a', version: '1.0-SNAPSHOT') {
    transitive = false// here You can exclude particular dependency, not necessarily all
  }
  providedCompile group: 'javax', name: 'javaee-api', version: '6.0'
  testCompile group: 'junit', name: 'junit', version: '4.10'
}

不,我认为可以通过多种方式完成。这取决于构建方面的其他要求。

【讨论】:

  • 非常感谢!蛮力解决方案对我来说很好。附加说明:在我的环境中,在测试时发生有线 ClassFormatError (1.7.0_45-b18 + Gradle 1.9),但这似乎是另一个问题。
  • 嗯..这不是那么粗暴;]
  • ClassFormatError 是由于在单元测试示例中创建 Cookie 实例引起的,不是 gradle 问题。
  • 啊是的..我也有这个错误,但认为这是故意的。
  • 当然!对我来说,这似乎是一个非常全面的解决方案。
【解决方案2】:

如果 transitive 不起作用,可以尝试 resolution startegy。 我厌倦了传递性甚至正常的排除。

https://docs.gradle.org/2.2.1/dsl/org.gradle.api.artifacts.ResolutionStrategy.html

dependencies{
        compile(group: 'ruimo', name: 'module_a', version: '1.0-SNAPSHOT')
    }

configurations.all {
    resolutionStrategy {
        force ruimo:module_a:1.0-SNAPSHOT
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2022-08-16
    • 2014-08-10
    相关资源
    最近更新 更多