java - 带有 'doLast' 的空源 jar,搞砸了子项目依赖关系,但没有

标签 java gradle

我在 build.gradle 中有一个任务,如下所示:

task sourceJar(type: Jar, dependsOn: classes) << {
  classifier = 'sources'
  from sourceSets.main.allSource
}

正在运行gradle sourceJar在 libs/中创建一个 jar 文件,但它是空的(不包含任何源,仅包含 list )。 正在删除<<由于某种原因修复了它,正确创建了 jar,但搞砸了其他事情(子项目现在失去了专门为其定义的编译依赖项)。

所以,这里有三个(也许是四个?)问题: (1)出了什么问题?当使用<<定义任务时,为什么sourceSets为空? (2)为什么删除<<修理它?我的理解是,它只是使 block 的内部每次都“内联”执行,而不仅仅是在专门执行任务时。 (3) 如何解决这个问题?我不能直接删除<< ,因为,就像我说的,它搞砸了其他事情(但请参阅问题#4)。 (4)为什么删除<<把子项目搞砸了?这是预期的吗? 为了澄清一下,这就是我所说的:

subprojects {
 apply plugin: 'java'
 dependencies {
   compile project(':a')
 }

 task  cp  << {
  println ("PROJECT " + project.name + ">> " + sourceSets.main.runtimeClasspath.collect { it.absolutePath }.join(':'))
 }
}

project(':b') {
  dependencies {
   compile project(':c')
  }
}

正在运行gradle -q b:cp打印出来

PROJECT b>> b/build/classes/main:b/build/resources/main:a/build/libs/a.jar:c/build/libs/c.jar

(我删除了绝对路径)。这就是我要的。

现在,如果我删除 <<从文件中,然后运行 ​​gradle -q b:cp再次,我明白了

PROJECT a>> a/build/classes/main:a/build/resources/main:/a/build/libs/a.jar
PROJECT b>> b/build/classes/main:b/build/resources/main:a/build/libs/a.jar
PROJECT c>> c/build/classes/main:c/build/resources/main:a/build/libs/a.jar

这在两个方面是错误的:首先,我没有要求它为所有三个子项目运行,只是为 b 运行。 ,第二,请注意 b没有c不再在其类路径中。

有线索的人可以帮我弄清楚这里发生了什么吗...我真的要放弃并转向 sbt(是的,这是一个威胁!)。

最佳答案

当您声明类型为:Jar 的任务时,不必使用 << ,因为您正在有效地扩展一个 jar 任务,该任务已经拥有所有必需的 <<声明正确。但首先听起来你需要阅读什么 <<意味着以及关于gradle的配置和执行阶段。

请在此处查看彼得的回答:Why is my Gradle task always running?

(<<doLast的gradle简写,任何未包含在doLast中或未由<<注释的任务代码都会在配置阶段而不是执行阶段执行。这可能会导致您的printlns 例如在未显式调用任务时执行,因为所有任务即使未执行也已配置)

其次,您的 cp 任务没有扩展任务类型。所以这需要 <<在其定义中。

 task  cp  << { ... }

关于java - 带有 'doLast' 的空源 jar,搞砸了子项目依赖关系,但没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796107/

相关文章:

java - PreparedStatement 中的这些值/参数是什么意思?

java - 使用 postgres 和 jooq 按时间分组

java - gradle 可以只包含特定的包并排除其他所有包吗

java - 是否可以在 Java 中更改数组的类型?

java - 卡在 javafx.graphics 上不会将 com.sun.javafx.sg.prism 导出到未命名模块

java - 将来使用 NIO 和 NIO2 处理文件和文件系统 : Before NIO,

java - 无法在plugins {} block 中使用 'jsonschema2pojo' gradle插件?

android - 这些 gradle 术语对 android 有什么用?

gradle - 如何使用由 kotlin 多平台创建的 Javascript 工件

java - Minecraft Forge Mod使gradlew构建不起作用