当前位置: 首页 > 知识库问答 >
问题:

Gradle提供了Intellij的依赖关系

翁心思
2023-03-14

我正在尝试构建一个Bukkit插件。该插件还使用exp4j。最终结果需要在发布的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)
        }
    }
}

这非常有效,我可以从命令行使用Gradle愉快地构建和运行项目。问题在于Intellij(或者可能是Gradle idea插件)无法识别提供的依赖项,因此,从Bukkit导入任何内容都会导致错误报告。

我怎样才能让所提供的依赖项很好地与idea配合呢?

我还尝试像这样声明提供的范围:

configurations {
    provided
    compile.extendsFrom provided
}

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

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

共有3个答案

段干玺
2023-03-14

我确实找到了一个非常糟糕的解决方案。但是太糟糕了,我觉得把它贴在这里很糟糕: P

  1. 将提供的依赖项声明为运行时依赖项
  2. 重新生成想法文件:gradle cleanIdea想法
  3. 想法现在应该认识到依赖性
  4. 将提供的依赖项更改回提供的依赖项
  5. 进入项目设置,并将具有运行时作用域的所有依赖项转换为 Intellij 提供的作用域
  6. 东西:)(只是永远不要重新生成想法文件)

明显的问题,任何使用你的项目的人都必须做同样的黑客攻击。每次你重新生成想法文件时,同样的事情将不得不重复。

徐洋
2023-03-14

请参阅此处的Gradle问题。

gradle中没有提供配置,尽管实际上应该有一个。目前最合理的解决方法似乎是创建您自己的配置:

configurations {
    provided
}

然后:

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

extendsFrom 的问题在于,所提供的依赖项最终将被捆绑到您的发行版中,除非您添加另一个显式排除,从而破坏了提供的整个要点。

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

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

在此处查看更多内容。

丁善
2023-03-14

在Gradle 2.12及更高版本中,有一个名为<code>compileOnly</code>的配置,它提供了您想要的语义。

关于这个配置的更多信息,请访问Gradle关于这个主题的博客。

在2.12之前,您可以使用星云。提供基本插件,以创建具有所有正确语义的提供的配置。

 类似资料:
  • 我的结构如下: 项目A- 项目B- 编译项目B一切正常: 项目B/build.gradle: ProjectB/settings.gradle: 然而,在编译ProjectA时,它表示找不到ProjectC ProjectA/build.gradle: ProjectA/settings.gradle: 这将显示以下错误: 其中:构建文件ProjectB\build.gradle 出了什么问题:

  • 我有一个J2ee项目,它使用了诸如Jsf、EJB、持久性API等技术。但是我怎么知道这些模块需要的wich版本。例如: 现在,我在maven中央存储库中查找这些信息:GroupId、ArtifactID和最新版本。但有一个更简单的方法做到这一点?

  • 我目前正在尝试将一个通过RFC连接到SAP系统的旧Java EE解决方案迁移到Quarkus。由于项目使用maven,我再次面临sapjco3的问题。来自SAP的jar库,防止该库被重命名。如果我像那样添加库作为依赖项 它将被添加到lib目录中,名称为com.sap.sapjco3-3.1.jar.不幸的是,最终以异常结束 JAVAlang.ExceptionInInitializerError:

  • 我正在尝试编译几个WAR文件,所有这些都依赖于一个公共的JAR模块。然而,在我的Gradle构建中,我似乎无法获得类似于“提供”的依赖关系来使用Java插件。 然而,最后这一位将生成具有适当依赖关系的变量newRuntime,然而,当我试图将该变量重新分配回运行时配置时,它抛出一个“无法找到属性异常”。 我在Gradle的bug跟踪中发现了很多关于这个问题的讨论:Gradle-784 然而,这方面

  • 问题内容: 我有一个依赖关系如下: 当我部署一切正常时,这将拉下另一个引发ClassDefNotFound的依赖项。 我添加了两个依赖项,如下所示: 并且仍然面临着同样的问题,即:MVN带来下来不 我该如何解决? 编辑: 添加; 问题答案: 您可能有一个传递依赖项,另一个依赖项取决于您不需要的版本。 要获得所有直接和传递依赖关系的概述,请尝试: mvn依赖项:树 如果您发现同一依赖项的不同版本之间