【问题标题】:Gradle provided dependencies with IntellijGradle 通过 Intellij 提供依赖项
【发布时间】:2016-01-20 11:23:59
【问题描述】:

我正在尝试构建一个 Bukkit 插件。该插件还使用exp4j最终结果需要在发布的jar中包含exp4j代码但没有包含Bukkit代码。

我按照this answer 的建议复制了依赖项,并使用this answer 将Bukkit 声明为提供。我的 build.gradle 现在看起来像这样:

apply plugin: 'java'
apply plugin: 'idea'

configurations {
    provided
}

sourceSets {
    main.compileClasspath += configurations.provided
    test.compileClasspath += configurations.provided
    test.runtimeClasspath += configurations.provided
}

dependencies {
    provided "org.bukkit:bukkit:1.8.8-R0.1-SNAPSHOT"
    compile "net.objecthunter:exp4j:0.4.5"
}

jar {
    // copy the dependencies across
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
}

这很好用,我可以从命令行使用 Gradle 愉快地构建和运行项目。问题是 Intellij(或者可能是 Gradle idea 插件)无法识别提供的依赖项,因此,从 Bukkit 导入任何内容都会导致它错误地报告错误。

我怎样才能让提供的依赖项与idea很好地配合?

我尝试过的其他事情:

我也尝试过像这样声明提供的范围:

configurations {
    provided
    compile.extendsFrom provided
}

但这会导致提供的依赖项被复制到最终的 jar 中。我也尝试了this answer 推荐的插件,但都导致 Bukkit 被复制到创建的 jar 中。我进一步尝试将 Bukkit 声明为运行时范围,而不是提供,但这只会导致很多编译错误(但有趣的是 Intellij 确实将 Bukkit 列为依赖项)

我很难相信以前没有人问过这个问题,但我已经搜索过,但找不到完整的解决方案。我是 Gradle 新手,如果这是一件超级简单的事情,我深表歉意。

【问题讨论】:

    标签: java intellij-idea gradle


    【解决方案1】:

    在 Gradle 2.12 及更高版本中,有一个名为 compileOnly 的配置具有您正在寻找的 provided 语义。

    有关此配置的更多信息,请访问 Gradle blog post 上的主题。

    在 2.12 之前,您可以使用 nebula.provided-base plugin 创建具有所有正确语义的 provided 配置。

    【讨论】:

      【解决方案2】:

      Gradle issue here

      gradle 中没有提供配置,但确实应该有。目前似乎最合理的解决方法是创建自己的配置:

      configurations {
          provided
      }
      

      然后:

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

      extendsFrom 的问题在于,提供的依赖项最终会被捆绑到您的发行版中,除非您添加另一个显式排除,从而破坏了提供的全部意义。

      编辑:要告诉idea使用提供的依赖项,您可以应用'idea'插件,然后:

      idea {
        module {
          scopes.PROVIDED.plus += [ configurations.provided ]
        }
      }
      

      more here.

      【讨论】:

      • 这很好...除了 intellij 无法识别提供的范围,因此不会使用提供的库
      【解决方案3】:

      我确实找到了一个非常老套的解决方案。但这太糟糕了,我觉得在这里发布它很糟糕:P

      1. 将提供的依赖声明为运行时依赖
      2. 重新生成idea文件:gradle cleanIdea idea
      3. 想法现在应该认识到依赖关系
      4. 将提供的依赖项改回提供的
      5. 进入项目设置,将所有具有运行时范围的依赖项转换为 Intellij 提供的范围
      6. 东西有效 :) (只是永远不要重新生成想法文件)

      明显的问题,任何使用您的项目的人都必须进行相同的破解。而且每次重新生成idea文件时,都必须重复同样的事情。

      【讨论】:

      • 只要知道这种方法的问题,这仍然是一个很好的 hack :)
      • @RaGe 在某些情况下,它还不错。但是某些依赖项还有许多其他依赖项,并且每个依赖项都需要手动设置为提供的范围......也许我只是讨厌手动做太多事情
      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多