我正在尝试构建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的新手,如果这是一件非常简单的事情,请道歉。
答案 0 :(得分:2)
在Gradle 2.12及更高版本中,有一个名为compileOnly
的配置,其中包含您要查找的提供的语义。
有关该主题Gradle blog post的此配置的更多信息。
在2.12之前,您可以使用nebula.provided-base
plugin创建具有所有正确语义的provided
配置。
答案 1 :(得分:1)
在gradle中没有提供配置,但确实应该有一个。目前最合理的解决方法是创建自己的配置:
configurations {
provided
}
然后:
sourceSets {
main {
compileClasspath += configurations.provided
}
}
extendsFrom
的问题在于,无论如何,所提供的依赖关系最终会捆绑在您的发行版中,除非您添加另一个显式排除,从而击败所提供的整个点。
编辑:要告知使用提供的依赖项,您可以应用'idea'
插件,然后:
idea {
module {
scopes.PROVIDED.plus += [ configurations.provided ]
}
}
请参阅more here.
答案 2 :(得分:1)
我确实找到了一个非常讨厌的解决方案。但它很糟糕我觉得在这里发帖很糟糕:P
明显的问题,任何使用你的项目的人都必须做同样的黑客攻击。每次重新生成构思文件时,都必须重复同样的事情。