Gradle提供了与Intellij的依赖关系

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

我按照这个答案的建议复制了依赖项,并使用这个答案来声明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导入任何内容会导致错误地报告错误。

如何才能让提供的依赖项与想法很好地结合?

我试过的其他事情:

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

 configurations { provided compile.extendsFrom provided } 

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

我很难相信以前没有问过这个问题,但是我已经搜索过,找不到完整的解决方案。 我是Gradle的新手,如果这是一个非常简单的事情,那么道歉。

请参阅Gradle问题 。

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

 configurations { provided } 

接着:

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

extendsFrom的问题在于, extendsFrom ,所提供的依赖关系最终都会捆绑在您的发行版中,除非您添加另一个显式排除,从而击败所提供的整个点。

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

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

在这里看到更多。

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

有关此主题的Gradle博客文章中有关此配置的更多信息。

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

我找到了一个非常讨厌的解决方案。 但它很糟糕我觉得在这里发布不好:P

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

显而易见的问题,任何使用你的项目的人都必须做同样的黑客攻击。 每次重新生成构思文件时,都必须重复同样的事情。