首页 文章

Gradle提供了与Intellij的依赖关系

提问于
浏览
2

我正在尝试构建一个Bukkit插件 . 该插件也使用exp4j . The final result needs to have the exp4j code included in the released jar but not have the Bukkit code included.

我按照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 idea插件)无法识别提供的依赖项,因此,从Bukkit导入任何内容会导致错误地报告错误 .

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

我试过的其他事情:

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

configurations {
    provided
    compile.extendsFrom provided
}

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

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

3 回答

  • 1

    Gradle issue here .

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

    configurations {
        provided
    }
    

    然后:

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

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

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

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

    more here.

  • 2

    在Gradle 2.12及更高版本中,有一个名为 compileOnly 的配置,它具有您正在寻找的 provided 语义 .

    有关此主题的Gradle blog post上的此配置的更多信息 .

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

  • 1

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

    • 将提供的依赖项声明为运行时依赖项

    • 重新生成想法文件:gradle cleanIdea idea

    • 想法现在应该认识到依赖性

    • 将提供的依赖项更改回提供的内容

    • 进入项目设置并将所有依赖项与运行时范围转换为Intellij提供的范围

    • 东西工作:)(只是不要重新生成想法文件)

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

相关问题