【问题标题】:providedCompile without war plugin提供编译不带war插件
【发布时间】:2012-12-05 05:33:20
【问题描述】:

我想为许多项目重复使用某些过滤器,因此我想提取它并使用单个 jar 将其添加到任何 Web 应用程序中。

对于构建,我使用的是 Gradle 1.3 和以下 build.gradle 文件:

apply plugin: 'java'

dependencies {

    compile group:'org.slf4j', name:'slf4j-api', version:'1.7.+'

    testCompile group:'junit', name:'junit', version:'4.+'

    compile group:'org.springframework', name:'spring-web', version:'3.+'   

    compile group:'org.slf4j', name:'slf4j-log4j12', version:'1.6.+'
    compile group:'log4j', name:'log4j', version:'1.2.+'

    providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.+'        

}

repositories {

    mavenCentral()

}

如您所见,我需要 servlet api 才能成功编译此过滤器,所以我想像 maven 提供的依赖项一样添加它。

无论如何,在运行gradle build 后,我收到以下错误:

找不到参数的方法providedCompile() [{group=javax.servlet, name=javax.servlet-api, version=3.+}] 在根 项目“休眠对话上下文”。

现在,我知道我不能在没有 WAR 插件的情况下使用 providedCompile,但我需要项目是一个简单的 JAR。有没有其他方法可以做到这一点?

【问题讨论】:

标签: gradle


【解决方案1】:

java 插件没有这种开箱即用的配置。但是,您可以按如下方式自行构建:

configurations { providedCompile }

dependencies {
    providedCompile "javax.servlet:javax.servlet-api:3.+"
}

sourceSets.main.compileClasspath += configurations.providedCompile
sourceSets.test.compileClasspath += configurations.providedCompile
sourceSets.test.runtimeClasspath += configurations.providedCompile

这会添加配置,并将所有依赖项放在主类和测试类的编译类路径中。您还需要将其添加到 runtimeClasspath,因为它不包括根据 gradle DSL 文档编译的类路径。

【讨论】:

  • 只是警告人们这个解决方案与 Eclipse 不兼容。 dty 的答案显示了让它在那里工作的方法。基本上只需在构建文件中添加:eclipse.classpath.plusConfigurations += configurations.providedCompile。
  • 有关适用于 Eclipse 和 IntelliJ 的解决方案,请参见此处:stackoverflow.com/a/25809968/2591231
  • 当我们想要添加对idea插件的支持时,事情变得复杂了。 Gradle 2.x 构建在 Groovy 2.3 之上,不支持使用 += 将单个元素添加到集合中。这可能会导致失败“解决后无法更改配置':提供'”。答案中 += 的用法是可以的,但如果你有这个错误,你可能需要在 += 之后用 [ ] 包裹右侧。请参阅此讨论:discuss.gradle.org/t/…
  • 我提交了一个功能请求,discuss.gradle.org/t/need-providecompile-for-java-plugin/10457 为java插件添加providedCompile
  • 这似乎破坏了 javadoc {@link } 引用
【解决方案2】:

我最近写了一篇博文,正好涵盖了这种情况。它还向您展示了如何正确设置与 Eclipse 的集成。

http://blog.codeaholics.org/2012/emulating-mavens-provided-scope-in-gradle/

【讨论】:

    【解决方案3】:

    看看 Gradle 插件propdeps from SpringSource。来自项目描述:

    为 Gradle 提供额外的可选和提供的依赖配置以及 Maven POM 生成支持。

    【讨论】:

    • 感谢您的指点,SpringSource 页面中的示例为我解决了这个问题。我认为 Gradle 没有开箱即用的概念很奇怪。
    • 这是一个简单的解决方案,但我发现它仍然会导致提供的 JAR 被打包到我的 WAR 中,这是我不希望发生的。
    【解决方案4】:

    有一个更简单的方法:

    configurations {    
        provided
        provided.extendsFrom(compile)
    }
    

    然后你可以:

    dependencies {  
        provided group: 'javax.servlet', name: 'javax.servlet-api', version:'3.+' 
    }
    

    您还希望在 Eclipse 或 Idea 的生成项目文件中包含提供的库:

    idea.module.scopes.PROVIDED.plus += configurations.provided
    eclipse.classpath.plusConfigurations += configurations.provided
    

    【讨论】:

    • 如果没有 sourceSets-additions,我无法让它工作。我究竟做错了什么?不过,感谢 IDEA 的修复。
    • 此外,Eclipse 和 IntelliJ 修复程序现在需要在它们周围加上方括号,例如:eclipse.classpath.plusConfigurations += [ configurations.provided ]
    【解决方案5】:

    为了使 javadoc 正常工作,我必须添加以下内容:

    javadoc.classpath=sourceSets.main.compileClasspath
    

    【讨论】:

    • 在 build.gradle 文件中接受上述答案之后。谢谢。
    【解决方案6】:

    当您发现自己在使用 Gradle 2.12 时,将“providedCompile”更改为“compileOnly”。

    【讨论】:

      【解决方案7】:

      Gradle 2.12 开始,定义仅编译依赖项的问题终于通过新的“copmpileOnly”配置以简单自然的方式解决了:

      dependencies {
          compileOnly 'javax.servlet:servlet-api:2.5'
      }
      

      【讨论】:

      • 在我看来,compileOnly 的语义略有不同。 providedCompile 表明应用服务器将提供它,而 compileOnly 表明该包仅在编译期间需要(例如 Lombok 注释)而不是在运行时。
      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2014-11-24
      • 2015-03-14
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2022-08-14
      相关资源
      最近更新 更多