Gradle Copy任务说没有来源

时间:2017-12-04 15:51:44

标签: gradle

我将此Gradle脚本作为deploy.gradle(Gradle 4.3.1):

defaultTasks 'echoProp'
import org.apache.tools.ant.filters.ReplaceTokens

task copyWar(type: Copy) {
    from "${source}"
    into "${target}"
    include '*.war'
}

task echoProp(dependsOn: copyWar) << {
    println "source dir: ${source}"
    println "target dir: ${target}"
    println "source = ${project.property('source')}"
    def currentJvm = org.gradle.internal.jvm.Jvm.current()
    println currentJvm
}

这是粗略的输出:

                                        The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
    at deploy_13e4yjnom30svmprt2wccq4te.run(E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\71\deploy.gradle:10)
    (Run with --stacktrace to get the full stack trace of this deprecation warning.)
:copyWar NO-SOURCE
:echoProp
source dir: E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/source/71
target dir: E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/target
source = E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/source/71
1.8.0_31 (Oracle Corporation 25.31-b07)

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

这在Windows Server 2012 R2计算机上运行。我查了一下,在定义的源目录中有一个.war文件。

我无法弄清楚为什么它不会复制testApp.war文件。我的意思是,源目录由其他任务定义得很好,但为什么copyWar任务不能找到这些文件?

删除&lt;&lt;&lt;&lt;&lt;并使用--info标志运行:

Initialized native services in: C:\Windows\System32\config\systemprofile\.gradle\native
The client will now receive all logging from the daemon (pid: 5580). The daemon log file: C:\Windows\System32\config\systemprofile\.gradle\daemon\4.3.1\daemon-5580.out.log
Starting 19th build in daemon [uptime: 1 hrs 14 mins 1.715 secs, performance: 98%, no major garbage collections]
Using 2 worker leases.
Creating new cache for fileHashes, path E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\.gradle\4.3.1\fileHashes\fileHashes.bin, access org.gradle.cache.internal.DefaultCacheAccess@6e59e113
Creating new cache for plugin-use-metadata, path C:\Windows\System32\config\systemprofile\.gradle\caches\4.3.1\plugin-resolution\plugin-use-metadata.bin, access org.gradle.cache.internal.DefaultCacheAccess@4092835c
Creating new cache for client-status, path C:\Windows\System32\config\systemprofile\.gradle\caches\4.3.1\plugin-resolution\client-status.bin, access org.gradle.cache.internal.DefaultCacheAccess@4092835c
Starting Build
Settings evaluated using settings file.
Projects loaded. Root project using build file 'E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\deploy.gradle'.
Included projects: [root project '72']
Evaluating root project '72' using build file 'E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\deploy.gradle'.
Compiling build file 'E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\deploy.gradle' using SubsetScriptTransformer.
Compiling build file 'E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\deploy.gradle' using BuildScriptTransformer.
source dir: file tree
target dir: E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/target
source dir: E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/source/72
target dir: E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/target
source = E:/environments/GRADLE_TEST/TEST/TESTDEPLOY/source/72
1.8.0_31 (Oracle Corporation 25.31-b07)
All projects evaluated.
No tasks specified. Using project default tasks 'echoProp'
Selected primary task 'echoProp' from project :
Tasks to be executed: [task ':copyWar', task ':echoProp']
Creating new cache for resourceHashesCache, path E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\.gradle\4.3.1\fileHashes\resourceHashesCache.bin, access org.gradle.cache.internal.DefaultCacheAccess@6e59e113
Creating new cache for taskHistory, path E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\.gradle\4.3.1\taskHistory\taskHistory.bin, access org.gradle.cache.internal.DefaultCacheAccess@1e64a7a6
Creating new cache for outputFiles, path E:\environments\GRADLE_TEST\TEST\TESTDEPLOY\source\72\.gradle\buildOutputCleanup\outputFiles.bin, access org.gradle.cache.internal.DefaultCacheAccess@4faa606d
:copyWar (Thread[Daemon worker Thread 15,5,main]) started.
:copyWar
Putting task artifact state for task ':copyWar' into context took 0.0 secs.
Skipping task ':copyWar' as it has no source files and no previous output files.
:copyWar NO-SOURCE
:copyWar (Thread[Daemon worker Thread 15,5,main]) completed. Took 0.002 secs.
:echoProp (Thread[Daemon worker Thread 15,5,main]) started.
:echoProp
Skipping task ':echoProp' as it has no actions.
:echoProp UP-TO-DATE
:echoProp (Thread[Daemon worker Thread 15,5,main]) completed. Took 0.004 secs.

来自我的Gradle.properties的源和目标变量:

source=E\:/environments/GRADLE_TEST/TEST/TESTDEPLOY/source/72
target=E\:/environments/GRADLE_TEST/TEST/TESTDEPLOY/target

我对Gradle完全不熟悉,所以我不确定这一切意味着什么。

3 个答案:

答案 0 :(得分:5)

您的错误是Copy任务有一个名为source的属性 您将此属性的toString()表示形式(file tree)提供给from方法。
当然没有找到WAR个文件,因此复制任务无关 将您的source属性重命名为不同的属性,或使用project.source显式引用项目的source属性,而不是任务中的属性。

此外into "${target}"into target相同,但性能更高。 sourcetarget已经是字符串,但您将它们用作占位符,这意味着需要首先评估占位符,这对于没有多大意义。

答案 1 :(得分:2)

考虑这个gradle.properties

srcDir=./dist
targetDir=./target

您可以将disttarget替换为所需的文件夹。使用srcDir意味着我们不会与Copy任务的属性发生冲突。

然后,这个build.gradle

task copyWar(type: Copy) {
    from srcDir
    into targetDir
    include '*.war'
}

应该有效(对我而言)。

答案 2 :(得分:0)

非常仔细地检查目录或文件名是否拼写错误。 Gradle不会告诉您它不认识的内容,只会说

Task :xxx NO-SOURCE