Java Gradle提供了Intellij的依赖项
我正在尝试构建一个Bukkit插件。该插件还使用了。最终结果需要在发布的jar中包含exp4j代码,但不包含Bukkit代码 我按照的建议在中复制依赖项,并按照提供的声明Bukkit。我的build.gradle现在看起来像这样:Java Gradle提供了Intellij的依赖项,java,intellij-idea,gradle,Java,Intellij Idea,Gradle,我正在尝试构建一个Bukkit插件。该插件还使用了。最终结果需要在发布的jar中包含exp4j代码,但不包含Bukkit代码 我按照的建议在中复制依赖项,并按照提供的声明Bukkit。我的build.gradle现在看起来像这样: apply plugin: 'java' apply plugin: 'idea' configurations { provided } sourceSets { main.compileClasspath += configurations.p
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)
}
}
}
configurations {
provided
compile.extendsFrom provided
}
这非常有效,我可以从命令行使用Gradle愉快地构建和运行项目。问题是Intellij或者Gradle idea插件无法识别提供的依赖项,因此,从Bukkit导入任何内容都会导致错误报告
如何使提供的依赖项与idea配合良好
我尝试过的其他事情:
我还尝试过这样声明提供的范围:
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)
}
}
}
configurations {
provided
compile.extendsFrom provided
}
但这会导致将提供的依赖项复制到最终的jar中。我也尝试了推荐的插件,但都会导致Bukkit被复制到创建的jar中。我进一步尝试将Bukkit声明为运行时范围,但这只会导致大量编译错误,但有趣的是Intellij确实将Bukkit列为依赖项
我很难相信以前没有人问过这个问题,但我已经搜索过了,无法找到完整的解决方案。我是Gradle的新手,所以如果这是一件非常简单的事情,请道歉。请参阅
gradle中没有提供配置,尽管确实应该有一个。目前最合理的解决办法似乎是创建自己的配置:
configurations {
provided
}
然后:
sourceSets {
main {
compileClasspath += configurations.provided
}
}
idea {
module {
scopes.PROVIDED.plus += [ configurations.provided ]
}
}
ExtendFrom的问题是,提供的依赖项最终将被捆绑在您的发行版中,除非您添加另一个显式排除,从而破坏了提供的整个要点
编辑:要告诉idea使用提供的依赖项,您可以应用“idea”插件,然后:
idea {
module {
scopes.PROVIDED.plus += [ configurations.provided ]
}
}
请看我确实找到了一个非常棘手的解决方案。但这太糟糕了,我觉得把它贴在这里很糟糕:P 将提供的依赖项声明为运行时依赖项 重新生成idea文件:gradle cleanIdea idea Idea现在应该认识到这些依赖 将提供的依赖项更改回提供的 进入项目设置并将所有具有运行时范围的依赖项转换为Intellij提供的范围 东西是有用的:只是永远不要重新生成idea文件
显而易见的问题是,任何使用您的项目的人都必须进行相同的破解。每次您重新生成idea文件时,都必须重复相同的操作。在Gradle 2.12及更高版本中,有一个名为compileOnly的配置,它具有您正在寻找的所提供的语义 有关此配置的更多信息,请参阅
在2.12之前,您可以使用nebula.provided-base创建具有所有正确语义的配置。这很好。。。除了intellij无法识别所提供的范围,因此不会让所提供的库被使用之外,只要人们意识到这种方法的问题,这仍然是一种很好的破解方法:@RaGe在某些情况下,还不算太坏。但是有些依赖项有许多其他依赖项,并且它们中的每一个都需要手动设置为提供的范围。。。也许我只是讨厌手工做太多的事情