【问题标题】:Gradle java-library: api but compileOnlyGradle java-library: api 但只编译
【发布时间】:2021-04-21 17:36:54
【问题描述】:

rootProject:创建战争

子项目 foo

apply plugin: 'java-libarary
dependencies {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

子项目栏

apply plugin: 'java-libarary

dependencies {
    compile project(':foo')
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

有没有办法不两次在 javax.servlet-api 上添加相同的依赖项? 项目 foo 的一些 compileOnly 依赖项需要添加到项目栏,但它不应该在战争中。需要这样的配置:

apiCompileOnly

【问题讨论】:

    标签: java gradle dependencies war


    【解决方案1】:

    在根项目build.gradle 中添加:

    apply plugin: 'java-libarary'
    subprojects {
        compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
    }
    

    或者

    apply plugin: 'java-libarary'
    subprojects.findAll { ['foo', 'bar'].contains(it.name) }.each {
        compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
    }
    

    【讨论】:

      【解决方案2】:

      如果您需要像 apiCompileOnly 这样的配置,没有什么能阻止您创建一个。

      configurations {
          apiCompileOnly
      }
      

      configurations.create('apiCompileOnly')
      

      或者您可以将它们从war 中排除:

      war {
          rootSpec.exclude('**/javax.servlet-api-*.jar')
      }
      

      您可以通过根build.gradle 中的subprojects 在每个子项目中包含依赖项

      subprojects {
          dependencies {
          compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
          }
      }
      

      正如你所说的

      项目foo的一些compileOnly依赖需要添加到项目bar中,但不应该在war中。

      那么在这种情况下,subprojects 闭包不再那么方便了。 您可以添加所有子项目共有的依赖项,并将特定的依赖项添加到特定项目,但请记住传递性,因为如果您不禁用它,您的 project 依赖项将带来它们的传递性:

      compile (project(':foo')){transitive=false}
      

      或者您可以搜索您感兴趣的项目并添加您需要的内容,例如 @ToYonos 建议在另一个答案中

      【讨论】:

      • apiCompileOnly 应在 java-libarary 和 war 插件中支持以自动传播依赖项,但从运行时排除,例如 war。
      • @eastwater 我不确定你的意思我找不到任何关于apiCompileOnly 配置的信息。你从哪里找到这方面的信息?
      • 不存在,但是这个配置很有用。
      【解决方案3】:

      任何正在寻找一种方法来允许您的库或模块的使用者使用 compileOnly 依赖项(无需在使用模块中重新声明它们)的人现在都有 compileOnlyApi:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph

      这允许将库的依赖关系放在任何使用它的模块的编译时类路径上:

      子项目 foo

      apply plugin: 'java-libarary
      dependencies {
          compileOnlyApi group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
      }
      

      子项目栏现在可以在编译时访问 servlet 类,因为它导入了项目 foo

      apply plugin: 'java-libarary
      
      dependencies {
          compile project(':foo')
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 2014-04-05
        • 1970-01-01
        相关资源
        最近更新 更多