Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gradle提供了Intellij的依赖项_Java_Intellij Idea_Gradle - Fatal编程技术网

Java Gradle提供了Intellij的依赖项

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

我正在尝试构建一个Bukkit插件。该插件还使用了。最终结果需要在发布的jar中包含exp4j代码,但不包含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)
        }
    }
}
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在某些情况下,还不算太坏。但是有些依赖项有许多其他依赖项,并且它们中的每一个都需要手动设置为提供的范围。。。也许我只是讨厌手工做太多的事情