Java gradle:tar任务未创建tar.gz

Java gradle:tar任务未创建tar.gz,java,gradle,gradlew,Java,Gradle,Gradlew,您好,我有一个tar任务,我在看了很多方法和一些SO帖子之后做的 task buildDist(type: Tar, dependsOn: jar) { print 'here' archiveName = 'xyz-' + version destinationDir = file('build/dist') extension = 'tar.gz' compression = Compression.GZIP from 'build/libs' include

您好,我有一个tar任务,我在看了很多方法和一些SO帖子之后做的

task buildDist(type: Tar, dependsOn: jar) {
  print 'here'
  archiveName = 'xyz-' + version
  destinationDir = file('build/dist')
  extension = 'tar.gz'
  compression = Compression.GZIP

  from 'build/libs'
  include 'xyz.jar'
}
buildDist.mustRunAfter jar

我应用了
java
插件,
jar
任务使
xyz.jar
文件在
build/libs
下可用。
build/dist
目录还不存在,但我也尝试了
newfile(“build/dist”)
。这也不起作用——我甚至把它指向了存在的
build
目录——也不起作用。我使用
/gradlew clean build
运行整个脚本。上面代码中的打印不会打印。

我在这里做一些假设,因为您没有发布运行Gradle的输出

build
任务只是一个普通的Gradle任务,它本身不做任何事情。相反,它取决于其他任务。如果您创建自己的自定义任务,并且希望在执行
build
时将其包括在内,则必须向其添加依赖项。如果这不是问题所在,并且您确实做到了这一点,请提供更多详细信息,说明在运行
build
时,是什么使它“不起作用”

如果您想单独测试您的任务(例如,确保它在不运行单元测试或任何其他无关测试的情况下正常工作),只需运行
gradlew cleanBuildDist buildDist

关于“print”语句的一点说明-它在配置阶段执行,但这并不意味着您可以使用它来测试任务是否实际执行。事实上,无论您执行什么任务,它都很可能打印出来。如果要在执行时打印某些内容,则必须将其放入
doLast
块中

您还应该更改一些其他事项:

  • 使用相对引用不是一个好的做法。相反,使用
    buildDir
    属性获取对生成目录的绝对引用
  • 不要使用不推荐使用的方法,如
    archiveName
    destinationDir
    。改用
    archiveFileName
    destinationDirectory
  • 扩展名
    属性也不推荐使用,但如果您自己设置存档的全名,则会忽略该属性。所以把它拿走。这也意味着您缺少全名上的扩展名
  • 来自和包含的
    有点脆弱。如果您只想gzip应用程序jar,只需使用jar.archivePath中的
例如:

task buildDist(type: Tar, dependsOn: jar) {
  archiveFileName = "${jar.baseName}-${version}.tar.gz"
  destinationDirectory = file("$buildDir/dist")
  compression = Compression.GZIP
  from jar.archivePath
}

build.dependsOn buildDist

最后,如果您的意图是创建一个可以独立运行的应用程序的分布(所有需要的依赖项),那么您应该考虑使用,也可能使用.

,我在这里做了一些假设,因为您没有张贴Gealle的输出。

build
任务只是一个普通的Gradle任务,它本身不做任何事情。相反,它取决于其他任务。如果您创建自己的自定义任务,并且希望在执行
build
时将其包括在内,则必须向其添加依赖项。如果这不是问题所在,并且您确实做到了这一点,请提供更多详细信息,说明在运行
build
时,是什么使它“不起作用”

如果您想单独测试您的任务(例如,确保它在不运行单元测试或任何其他无关测试的情况下正常工作),只需运行
gradlew cleanBuildDist buildDist

关于“print”语句的一点说明-它在配置阶段执行,但这并不意味着您可以使用它来测试任务是否实际执行。事实上,无论您执行什么任务,它都很可能打印出来。如果要在执行时打印某些内容,则必须将其放入
doLast
块中

您还应该更改一些其他事项:

  • 使用相对引用不是一个好的做法。相反,使用
    buildDir
    属性获取对生成目录的绝对引用
  • 不要使用不推荐使用的方法,如
    archiveName
    destinationDir
    。改用
    archiveFileName
    destinationDirectory
  • 扩展名
    属性也不推荐使用,但如果您自己设置存档的全名,则会忽略该属性。所以把它拿走。这也意味着您缺少全名上的扩展名
  • 来自包含的
    有点脆弱。如果您只想gzip应用程序jar,只需使用jar.archivePath中的
例如:

task buildDist(type: Tar, dependsOn: jar) {
  archiveFileName = "${jar.baseName}-${version}.tar.gz"
  destinationDirectory = file("$buildDir/dist")
  compression = Compression.GZIP
  from jar.archivePath
}

build.dependsOn buildDist

最后,如果您的意图是创建一个可以独立运行的应用程序的分布(使用所有必需的依赖项),那么您应该考虑使用,也可能考虑使用.

比约恩,谢谢您的详细信息。是的,最初我有
buildDir
属性。切换到使用未弃用的方法,当我自己运行任务时是的,它没有扩展。我需要从我的源回购中包含一些其他内容,所以我必须坚持使用“从包含”。我使用了
buildDist.mustRunAfter jar
来触发任务,但我猜它不起作用。
jar.finalizedBy buildDist
使它起作用。我编辑了我的问题,添加了制作jar触发器buildDist的尝试。你能把这个加在你的答案上吗?我会把它标为接受的。蒂比约恩!比约恩:谢谢你提供的细节。是的,最初我有
buildDir
属性。切换到使用未弃用的方法,当我自己运行任务时是的,它没有扩展。我需要从我的源回购中包含一些其他内容,所以我必须坚持使用“从包含”。我使用了
buildDist.mustRunAfter jar
来触发任务,但我猜它不起作用。
jar.finalizedBy buildDist
使它起作用。我编辑了我的问题,添加了制作jar触发器buildDist的尝试。你能把这个加在你的答案上吗?我会把它标为接受的。蒂比约恩!