2017-08-19 14 views
2

MavenからGradleに移行している中で、1つのことで苦労しています。 MavenのPOMをベースにしたマルチプロジェクトのGradleプロジェクトがあります。 ほとんどはうまくいきますが、サブプロジェクトをビルドした結果としてのWARファイルとZIPファイルを収集する方法が見つかりません。各サブプロジェクトは、マイクロサービスを表します。 私たちは(またStackoverflowで)すべてのjarとサードパーティのlibsをディレクトリに集める方法を見つけました。しかし、マイクロサービスごとのリソースとライブラリを収集する方法を探しています。 Mavenので 我々はこのようなものでした:私は、私が見つけることができるディレクトリで終わるしたいすべてのgradleビルドアーティファクトを1つのディレクトリにアセンブルします

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <id>copy</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>Publish/</outputDirectory> 
         <artifactItems> 
          <artifactItem> 
           <groupId>....</groupId> 
           <artifactId>...</artifactId> 
           <version>${project.version}</version> 
           <type>zip</type> 
          </artifactItem> 
          <artifactItem> 
           <groupId>....</groupId> 
           <artifactId>...</artifactId> 
           <version>${project.version}</version> 
           <type>war</type> 
          </artifactItem> 

を:

アーティファクト(例えば、ZIP)を生成するプロジェクトのそれぞれにおいて
project1.war 
project2.war 
project3.zip 
etc. 

答えて

0

をバンドルする:artifact management

例えば参照してください。あなたが何かを微調整する必要がある場合は、簡単ですが、柔軟性があります。

以下はルートディレクトリのbuild.gradleです。各サブプロジェクトのために、それがされます:

  • は、サブプロジェクトのbuild/libsフォルダからコピーwarzipファイルがroot/distに(baseNameversionなど適切なを使用して)copyArtifactsタスクを定義します。
  • warタスクが見つかった場合は、その後にcopyArtifactsが実行されるようにタスクを構成します。

これは簡単に、他のタスク名を検索するように変更さなど異なるファイル名を一致させることができます(一つはようにコピーする前に与えられたアーティファクトの古いバージョンを削除したい、とあります。)

subprojects { Project subProject -> 
    task copyArtifacts { 
     doLast { 
      def baseName = subProject.archivesBaseName 
      def version = subProject.version 
      def group = subProject.group 
      def DIST_DIR = "${rootDir}/dist" 
      def SRC_DIR = "${buildDir}/libs" 

      ant.mkdir(dir: DIST_DIR) 
      ant.copy(todir: DIST_DIR) { 
       fileset(dir: SRC_DIR, 
       includes: "${baseName}*${version}*.war,${baseName}*${version}*.zip") 
      } 
     } 
    } 

    afterEvaluate { 
     def warTask = subProject.tasks.find { it.name == 'war' } 
     if (warTask) { 
      warTask.finalizedBy(copyArtifacts) 
     } 
    } 
} 
+0

これはほとんど動作しますが、ZIPはdistributions-directoryに保存されます。私は、ZIPを構築したプロジェクトのための2番目のタスクを追加しました。それは動作し、私はメインのbuild.gradleを変更するだけで、サブプロジェクトは変更する必要がありませんでした。それは管理しやすくなります。 – Pieter

0

アーティファクトを構成に追加します。次のソリューションは、手で

configurations { 
    archives 
} 
task myZip(type: Zip) { ... } 
artifacts { 
    archives myZip 
} 

その後、ユーバープロジェクトにあなたがアーティファクトやジップタスクを参照するために別の構成を使用しますそれら

configurations { 
    uber 
} 
dependencies { 
    uber project(path: ':project1', configuration: 'archives') 
    uber project(path: ':project2', configuration: 'archives') 
    uber project(path: ':project3', configuration: 'archives') 
} 
task uberZip(type: Zip) { 
    from configurations.uber 
    archiveName 'uber.zip' 
    destinationDir "$buildDir/uber" 
}  
+0

組み込みの機能を使用しているので面白そうです。しかし、私はuber-zipが必要ではなく、いくつかのデフォルトアーティファクト(WARとZIP)が中央のディレクトリにコピーされています。これらの機能でも可能かどうかわかりません。 – Pieter

+0

単純ですが、 'uberZip'タスクを' Copy'タイプの 'uberCopy'タスクで置き換えてください。 'from'節を残すことができます –

関連する問題