2016-04-29 17 views
0

私のWARファイルには、コンポーネントのJavaソースファイルが含まれている必要があります。 私はプログラム的にサブプロジェクトでタスクを実行しています、私のルートプロジェクトのbuild.gradleで:Gradle:サブプロジェクトでタスクをプログラムで実行する

task copySourceFiles(type: Copy) { 
    destinationDir = file(project.buildDir.name + '/sourceFiles') 

    into('componentName') { 
     from(project.projectDir) 
     exclude('build') 
     exclude('bin') 
     exclude('src/main/webapp') 
     exclude('.gradle') 
    } 
} 

コンソール出力:

[sts] ----------------------------------------------------- 
[sts] Starting Gradle build for the following tasks: 
[sts]  clean 
[sts]  build 
[sts] ----------------------------------------------------- 
copyFilesTask.destinationDir=<...>application1\build\sourceFiles 
:clean 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:war 
copyFilesTask.destinationDir=<...>application1\build\sourceFiles 
copyFilesTask.destinationDir=<...>application1\build\sourceFiles 
copyFilesTask.destinationDir=<...>application1\build\sourceFiles 
:assemble 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test UP-TO-DATE 
:check UP-TO-DATE 
:build 

、ということを意味

apply plugin: 'war' 

jar.enabled = false 
war { 
    // - Copy Java source files to the folder corresponding to the component; 
    into("/") { from { collectFilesFromCopyTask('copySourceFiles') } } 
} 

// Collects files from destinationDirs of copy tasks with matching taskName 
def collectFilesFromCopyTask(taskName) { 
    FileCollection collectedFiles = files{} 

    // for each task in subprojects 
    subprojects.each {project -> 
     project.tasks.withType(Copy).matching { task -> task.name.equals(taskName) }.each { copyFilesTask -> 
      println 'copyFilesTask.destinationDir=' + copyFilesTask.destinationDir 

      // execute task 
      copyFilesTask.execute() 

      // add destinationDir of the task to the collected files 
      collectedFiles += files(copyFilesTask.destinationDir) 
     } 
    } 

    return collectedFiles 
} 

をサブプロジェクトでは、私は仕事を持っていますcollectFilesFromCopyTask()は4回実行されます。 WARタスクから一度だけ実行する必要があります。

答えて

1

.execute()タスクをGradleで使用することは絶対にありません。

......... の場合を除き、決してこれを行うことはありません。

サポートされているものではありませんし、おそらく期待どおりに動作しません。

依存関係のあるタスクが実行されていること、またはタスクが両方とも実行されていても互いに依存していない場合は、タスクが特定の順序で実行されていることを確認するために、常にタスクの依存関係またはタスクの順序の依存関係を使用します。

warタスクはコピータスクによって異なり、warタスクではこれらのタスクの出力を使用します(手動files(...)コールではありません)。

EDIT:

war { 
into("/") { from { subprojects.tasks*.findByName('copySourceFiles').findAll { it instanceof Copy } } } 
} 
+0

>>あなたの戦争のタスクは、これらのタスクの出力を使用します<<私はそれをどのように行うのですか? – isobretatel

+0

単純に 'from mySuperFancyTask'はすべきです。このように宣言すると、このように使用すると暗黙的なタスクの依存関係が追加されるため、タスクの依存関係を犠牲にすることさえできるかもしれません。 – Vampire

+0

'application1:copySourceFiles'からエラーが発生しました:URL 'application1:copySourceFiles'をファイルに変換できません。 – isobretatel

関連する問題