Gradle提供了与Intellij的依赖关系

时间:2016-01-20 11:23:59

标签: java intellij-idea gradle

我正在尝试构建Bukkit插件。该插件还使用exp4j最终结果需要将exp4j代码包含在已发布的jar中,但包含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的想法插件)并不能识别所提供的依赖关系,因此,从Bukkit导入任何内容都会导致错误地报告错误。

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

我尝试过的其他事情:

我也试过宣布提供的范围如下:

configurations {
    provided
    compile.extendsFrom provided
}

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

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

3 个答案:

答案 0 :(得分:2)

在Gradle 2.12及更高版本中,有一个名为compileOnly的配置,其中包含您要查找的提供的语义。

有关该主题Gradle blog post的此配置的更多信息。

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

答案 1 :(得分:1)

请参阅Gradle issue here

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

configurations {
    provided
}

然后:

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

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

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

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

请参阅more here.

答案 2 :(得分:1)

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

  1. 将提供的依赖项声明为运行时依赖项
  2. 重新生成构思文件:gradle cleanIdea idea
  3. 理念现在应该认识到依赖
  4. 将提供的依赖项更改回提供的
  5. 进入项目设置并将所有依赖项与运行时范围转换为Intellij提供的范围
  6. 东西工作:)(只是没有重新创建想法文件)
  7. 明显的问题,任何使用你的项目的人都必须做同样的黑客攻击。每次重新生成构思文件时,都必须重复同样的事情。