自定义源集的“添加对模块[项目].main”的依赖

epggiuax  于 2022-10-07  发布在  其他
关注(0)|答案(1)|浏览(142)

这源于我刚刚在INTJ:https://youtrack.jetbrains.com/issue/IDEA-302732/Gradle-wrapper-builds-jar-from-custom-source-set-without-error-but-intelliJ-fails-import上提交的一个错误

我不认为这是一个真正的问题,因为所有这些都适用于Gradle,但它会在INTJ中产生虚假错误,在错误(如果是)修复之前,我正在寻找解决方法。它可能源自我的一些非传统做法,所以如果你看到任何让你认为“这里有一种更传统的方法”的东西,请告诉我。

我正在使用自定义源集在库项目中构建可执行JAR;它用于使用库但不包含在库中的工具。我知道其他人使用类似的方法进行演示和集成测试。

我为错误报告整理了一个最小的示例,下面是build.gradle.kts的要点(如果您愿意/需要,可以在报告中发布整个内容):

sourceSets["main"].java.srcDir("src")
sourceSets.create("eg") {
    java.srcDirs("src", "eg")
    compileClasspath = sourceSets["main"].compileClasspath
}

tasks.register<Jar>("foobar") {
    archiveFileName.set("foobar.jar")
    manifest { attributes["Main-Class"] = "FoobarKt" }
    // Not sure why this is necessary here, it isn't in the original project.
    duplicatesStrategy = org.gradle.api.file.DuplicatesStrategy.EXCLUDE
    dependsOn(configurations.runtimeClasspath)
    from(sourceSets["eg"].output)
    from({
        configurations.runtimeClasspath.get().filter {
            it.name.endsWith("jar") }.map { zipTree(it) }
    })
}

Src/main/kotlin/例如/Example.kt:

package Example

class Example {
    fun hello () {
        println("hello world")
    }
}

和/Foobar.kt中,可执行JAR的入口点:

import Example.Example

fun main () {
    val eg = Example()
    eg.hello()
}

如果我从项目目录运行./gradlew foobar,它构建时没有错误,并且如预期的那样通过java -jar运行。

然而,在INTJ编辑器中,Foobar.kt在第1行和第4行有Example的“未解决的引用”错误。它建议我“添加对模块Problem.main的依赖关系”,这是可点击的,但不执行任何操作。1

我承认我不是Gradle的粉丝--不管是什么原因,据说(?)直观的DSL对我来说一直是违反直觉的,我更愿意使用更普通的API(如果构建系统将是图灵完成的,为什么要让它变得难以理解?)--我就是不明白这是什么意思。

1.多年来,有许多其他报告都是关于“添加对模块的依赖...”建议在各种情况下什么都不做。

3xiyfsfu

3xiyfsfu1#

感谢Andrey在错误报告中发布了解决方案。它是一个有待修复的错误,还是需要注意的不一致之处,取决于其他人,但有效的方法是将主源集的output添加到自定义源集的定义中的compileClasspath

sourceSets.create("eg") {
    java.srcDirs("src", "eg")
    compileClasspath = sourceSets["main"].compileClasspath
    // You can use '+' as well to combine these in one line.
    compileClasspath += sourceSets["main"].output
}

您实际上只需要output来解决此处问题的示例中的问题,但如果自定义源集代码包括用implementationapi声明的项目依赖项的导入,则还需要主compileClasspath

相关问题