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

Gradle未在jar后运行复制任务

乌璞瑜
2023-03-14

我正在尝试这样做:

jar {
  doLast{
    from "build/libs/TheJar.jar"
    into "."
   }
}

到目前为止,我已经尝试了各种教程,包括这个答案中的所有形式,但都不起作用。唯一有效的是调用一个单独的任务,但我想知道为什么我的构造是错误的,为什么我不能在jar或影子Jar任务之后运行一些东西。

共有1个答案

施梓
2023-03-14

看起来你把链接帖子中的部分答案混在了一起,而不知道你的最终代码到底在做什么。

Gradle中的任务可能有一种类型(例如,CopyJar、…)。此类型定义任务执行后将执行的操作(所谓的任务操作)。没有类型的任务在执行时不会执行任何操作,除非手动添加任务动作。使用doFirst将传递的动作(也称为闭包)添加到任务动作列表的开头,使用doLast将其添加到列表的末尾。

doFirst和doLast闭包之外的所有内容都不是任务执行的一部分,但可以用于配置任务:

task example {
    doLast {
        println "second action"
    }
    doFirst {
        println "first action"
    }
    println "configuration"
}

使用gradle example运行上面的代码,您将看到日志消息的顺序为配置第一个动作第二个动作

任务配置将运行,即使任务稍后不会执行。即使您调用gradle(没有任何任务名称作为参数),控制台仍将打印配置。这是链接问题中的实际问题。

让我们来看看真正的问题:如何复制文件?

Gradle提供了两种复制文件的方法。第一个是任务类型复制。您可以基于此类型创建任务,应用配置,然后直接从命令行调用它,或者使用dependsOnfinalizedBy定义任务依赖项:

task copySomeFiles(type: Copy) {
    from '...'
    into '...'
}

但是,您不想创建额外的任务。Gradle还有一个名为Copy的方法,可以在脚本中的任何位置调用该方法并立即复制文件:

copy {
    from '...'
    into '...'
}

上面的代码会复制您的文件,但每次Gradle执行时它都会复制您的文件(这可能很常见,例如在使用IDE时)。要解决此问题,您可以使用复制将代码移动到任务操作中,例如在doFirstdoFinal闭包中:

jar {
    doLast {
        copy {
            from "build/libs/TheJar.jar"
            into "."
        }
    }
}

如您所见,您的代码缺少复制语句。现在,每当您的任务jar被执行时,它的最后一个任务操作将按预期复制文件。

加分题:为什么没有错误?

您的“问题”是,您的代码是完全有效的Gradle代码。任务jar属于jar类型。可以使用从到的方法来配置每个类型为Jar的任务。来自的方法将文件添加到JAR文件中,方法将文件添加到中,设置JAR内的目标目录。因此,您的代码不是复制,而是配置底层任务jar。然而,这并没有负面影响,因为这种配置在doLast中得到应用,而doLast只在创建JAR文件后运行。无法配置已发生的情况。

 类似资料:
  • 在安装生命周期期间,我需要在网络文件夹中复制一个可运行的jar。现在我试着在我的问题上添加更多的细节。我正在开发一个java程序使用maven一样的工具构建。之后 现在,我在pom中创建了一些配置文件,安装后,我需要将可运行的jar文件移到网络目录中。例如: 我在target/myjar.jar中的jar文件 网络文件夹位于\192.168.0.11\export\jars 为此,我使用具有以下配

  • 我有一个Gradle项目,它有来自不同存储库的大量依赖项(,)。在成功执行任务并检查zip存档后,我发现在文件夹中复制了某些JAR: bcprov-jdk14-1.38。jar和bcprov-jdk14-138。罐子 bcmail-jdk14-1.38。jar和bcmail-jdk14-138。罐子 Jar元组具有相同的大小和内容。我想这是因为在不同的存储库中,这些依赖项具有不同的文件名。当执行任

  • 我尝试用JavaExec类型创建gradle任务。在gradle文档中,我发现我不需要使用java插件。但是这个插件与android插件不兼容。如果我没有应用java插件,我会收到以下错误: 错误:无法找到或加载主类包。TestM 我的任务示例: 如果使用相同的任务创建java库模块,则会收到相同的错误: 错误:无法找到或加载主类 也许我需要设置类路径变量?如何在Android Studio中获取

  • 问题描述: 我正在使用Gradle Shade插件,它一切正常,它将资源文件复制到最终的jar。但是,正如文档所说,它不能包含其他文件作为资源,因为它无法将它们与依赖项区分开来。它解压缩它们是ntead。 我想做的是:我想复制额外的代码。jar

  • 我在跑Pop_OS!20.10 [✓] Flutter(Channel stable,1.22.3,Linux,locale en_US.UTF-8)•Flutter版本1.22.3 at/home/samdc/DevTools/Flutter•框架版本8874f21(3个月前),2020-10-29 14:14:35-0700•引擎版本a1440ca392•Dart版本2.10.3•Pub下载镜

  • 我已经从spring入门指南下载了源代码(zip文件):http://spring.io/guides/gs/rest-service/ 在文件夹“Complete”中生成整个项目已成功。使用Gradle(Gradle run)运行生成的jar文件也是成功的。但当我尝试在Windows命令行中使用“java-jar build\libs\gs-rest-service-0.1.0.jar”手动运行