35

小さなJava/Gradleプロジェクトがあります。アプリケーションプラグインを使用してzipディストリビューションを作成しています(distZipタスクを使用)。標準構成を使用すると、zipファイルに次のディレクトリが含まれます。

/bin- アプリケーションを起動するためのスクリプトはここにあります
/lib- プロジェクトコードがJARファイルとすべての依存関係JARファイルに含まれています。

問題は、構成ファイルを(アプリケーションのJARファイル内にパッケージ化する代わりに)配置できる3番目のディレクトリ/confが必要なことです。

log4j.xmlやhibernate.propertiesなどはJARファイルの外部に配置する方がよいため、これはかなり一般的な要件だと思います。ただし、これを行うためにアプリケーションプラグインの動作をカスタマイズする方法がわかりません。

4

5 に答える 5

38

私は数ヶ月後にこの問題を再検討し、ついにエレガントな解決策を手に入れました。次のコードをgradleファイルに追加する必要があります。

distZip {
    into(project.name) {
        from '.'
        include 'conf/*'
    }
}

これにより、distZipタスクに追加のインクルードが追加されます。これにより、「conf」ディレクトリ(コンテンツを含む)がZipディストリビューションにコピーされます。

生成されたzipファイルには、プロジェクト名と同じ単一のディレクトリが含まれています。これが「into」部分が必要な理由です。

于 2011-06-14T12:58:18.580 に答える
29

実際には、プロジェクトdistのdirの下にsrcdirを作成します。applicationDistributionこのディレクトリ内のすべては、installAppまたはdistZipが実行されるときに、アプリケーションプラグイン(の下)によってコピーされます。

applicationDistributionまたは、単純なコピーでは不十分な場合は、編集して他のことを行います。

于 2012-02-24T18:46:05.990 に答える
16

私にとっては、単純な

applicationDistribution.from("src/main/config/") {
    into "config"
}

仕事をしました。もちろん、コード内からプロパティを正しくロードする必要があります。特に、クラスパスを介して使用できるsrc / main / resourcesから、新しい場所に移動する場合は特にそうです。構成ファイルを指すコマンドラインパラメーターを追加することで、これを回避しました。

于 2014-03-31T11:19:48.297 に答える
7

アプリケーションプラグインをカスタマイズできるかどうかわかりません。使用したことはありません。ただし、達成したいことを達成する方法は他にもあります。

/conf次のようなディレクトリを作成できます。

confDir = new File("$buildDir/conf")

次に、必要なファイルを次のようにこのディレクトリにコピーできます。

task copyConfFiles(type: Copy) {
   from _wherever your files reside_
   into confDir
   include('**/*.properties') // your configuration files 
}

次に、このコピータスクを次のようなプロセスにフックできます。

distZip.dependsOn copyConfFiles

最後に、最終的なzipに構成を含めたくない場合は、次のようにすることができます。

distZip {
   exclude('**/*.properties') // your configuration files
}

繰り返しますが、もっと良い方法があるかもしれません。これが方法です。

于 2011-04-22T00:35:50.767 に答える
2

OPの自己回答は彼のユースケースには適しているかもしれませんが、改善したいことがいくつかあります。

  1. conf彼の答えは、彼がに平行なディレクトリを持っていることを示唆していbuild.gradleます。Maven標準ディレクトリレイアウトにはそのようなものはありません。一般的なコンセンサスはsrc/main/conf、ドキュメントで示唆されているようにすることです。

アーティファクトビルドに寄与する他のソースがある場合、それらは他のサブディレクトリの下にあります。たとえば、src / main/antlrにはAntlr文法定義ファイルが含まれます。

  1. ターゲットディレクトリ名はproject.name、コメントで指摘されているものではありません。

  2. リソースフィルタリングが必要であり、それが頻繁に必要な場合は、別のタスクを用意することが望ましいです。ローカル開発中に、このタスクを実行して、フィルター処理されたファイルを生成できます。ディストリビューションは、このタスクの出力を使用するだけです(OPの回答とは異なり、これconfはtarディストリビューションでも利用できるようになります)。

    def props = new Properties()
    file("src/main/filters/application.properties")
        .withInputStream { props.load(it) }
    
    import org.apache.tools.ant.filters.ReplaceTokens
    
    task copyConf(type: Copy) {
        from("src/main/conf/")
        into("$buildDir/conf")
        filesMatching("**/*.y*ml") {
            filter(tokens: props, ReplaceTokens)
        }
    }
    distributions {
        main {
            contents {
                from(copyConf) {
                    into("conf")
                }
            }
        }
    }
    
于 2017-12-18T03:33:40.500 に答える