2017-03-10 15 views
0

私は比較的グラデーションが新しく、これは典型的な初心者質問かもしれません。Gradle:既存の戦争からいくつかのファイルを削除する|各戦争ファイルのために:開梱、除去/フィルタリング、戦争を組み立てる

私たちのgradleビルドでは、earファイルを作成する前に、それらのwarファイルからすべて削除する必要のあるファイルがすべて含まれている一連のwarファイル(依存関係)があります。

がどのように私は次のことを達成することができます

- for all war files in a folder, 
    - extract war content to a location (using a Copy task & zipTree) 
    - re-pack to a new war applying a filter (using War & excludes) 

を私は新しいタスクを作成し、いくつかの「DEPENDSON」宣言を追加しますと仮定します。

task excludeUnwantedFiles(){ 

    file(directoryWithOriginalWars).eachFile { file -> 
     ???? unpack war, filter, assemble new war file ???? 
    } 
} 

ear.dependsOn(excludeUnwantedFiles) 
excludeUnwantedFiles.dependsOn(downloadAllOriginalWarsIntoDirectory) 

warファイルごとに実行するタスクを作成するにはどうすればよいですか?これを行う最善の方法は何ですか?

1つのタスクでこれを行う方法はありますか?例えば。コピータスクを使用し、zipTree(fooBarWithFile.war)を 'from'と 'war(fooBarWithoutFile.war)'として使用し、その間にフィルタを適用しますか?

これは、ループするだけの方法ですか? Delete/Remove file from war with Gradle

ご協力いただきありがとうございます。 乾杯、 d。

--------- UPDATE -------------------あなたのソリューションのための

ありがとうランスのJava。

私のコメントで述べたように、warファイルは実行時にダウンロード/抽出され、設定時に新しいタスクを定義するためにアクセスできないという問題に直面しました。

私の回避策は、まだ抽出されていないwarファイルのリストにアクセスするためにtarTree(フィルタ付き)を使用することです。以下の私のコード例を参照してください。

def warFileSourceTarGz = '...tar.gz' 
def nfsLibDir="$buildDir/dependencies/" 
def nfsLibDownloadDir="$buildDir/downloadedDependencies/" 

// task that downloads & extracts the tar.gz 
task fetchNfsDependencies(type: Copy) {    
    from tarTree(warFileSourceTarGz) 
    into nfsLibDownloadDir  
} 


// loop through all war files inside the tar.gz and 
// create a task to remove unwanted libraries for each war 
task excludeUnwantedJarsFromWars(dependsOn: fetchNfsDependencies){ 

    // access the "remote" tar.gz file to get the list of war-files to loop over 
    def warFileSource = tarTree(warFileSourceTarGz).matching{ 
      include '*.war' 
    } 

    // for every war-file, create an exclude-path  
    warFileSource.visit { nextWarFile -> 

     if(nextWarFile.name.endsWith('.war')) { 

      String taskName = "excludeUnwantedJarsFrom_${nextWarFile.name.replace('.war', '')}" 
      String nextWarFilePath = nfsLibDownloadDir+"/"+nextWarFile.name 

      Zip tweakWarTask = tasks.create(name: taskName, type: Zip, dependsOn: fetchNfsDependencies) { 

       from zipTree(nextWarFilePath) 
       destinationDir = file(nfsLibDir) 
       archiveName = nextWarFile.name 

       // exclude these jars, as they cause classloading problems in our ear deployment. 
       exclude 'WEB-INF/lib/jcan-optrace*' 
      }  

      // hook into build-process 
      ear.dependsOn(tweakWarTask) 
     } 
    } 
} 

ear.dependsOn(excludeUnwantedJarsFromWars) 

答えて

1

私はassembleを持っていることによってZip warファイルあたりのタスクとワイヤーDAGにすべてのタスクを作成したい、この提案のためにたくさんThaksすべて

FileTree warFiles = fileTree(dir: 'path/to/wars', includes: ['**/*.war']) 
warFiles.files.each { File warFile -> 
    String taskName = "tweakWar${warFile.name.replace('.war', '')}" 
    Zip tweakWarTask = tasks.create(name: taskName, type: Zip) { 
     from zipTree(warFile) { 
      exclude 'path/to/some/file.xml' 
     } 
     destinationDir = "$buildDir/tweakedWars" 
     archiveName = warFile.name 
    } 
    // wire the task into the dag 
    assemble.dependsOn tweakWarTask 
} 
+0

それらに依存に。私は、私が処理したい戦争ファイルがビルド中にダウンロードされたということを忘れていました。したがって、上記の解決策は、warファイルが既にフォルダ内に存在する場合にのみ、2回目のexceution =>で動作します。生成されたタスクを同じビルドで作成して実行するにはどうすればよいですか? – Dominik

+0

新しい設定(例えば 'wars')を作成し、war依存関係を' war'設定に追加することができます。私の例では 'fileTree'の代わりに' configurations.wars'を反復することができます –

関連する問題