这源于我刚刚在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.多年来,有许多其他报告都是关于“添加对模块的依赖...”建议在各种情况下什么都不做。
1条答案
按热度按时间3xiyfsfu1#
感谢Andrey在错误报告中发布了解决方案。它是一个有待修复的错误,还是需要注意的不一致之处,取决于其他人,但有效的方法是将主源集的
output
添加到自定义源集的定义中的compileClasspath
:您实际上只需要
output
来解决此处问题的示例中的问题,但如果自定义源集代码包括用implementation
或api
声明的项目依赖项的导入,则还需要主compileClasspath
。