2016-05-19 19 views
3

私のビルドはProjectAとProjectBという2つのプロジェクトのソースコードを使用し、ProjectBからクラスとリソースを含むJARを生成します。GradleでカスタムsourceSetのoutput.classesDirを指定する方法は?

sourceSets { 
    mainProjectB { 
     output.classesDir = "$buildDir/build/classes/projectB" 
     output.resourcesDir = "$buildDir/build/resources/projectB" 
     java { srcDirs = ['src/main/java']} 
     resources { srcDirs = ['src/main/resources']} 
    } 
    mainProjectA { 
     java { srcDirs = [ 
       '../projectA/src/main/java' 
      ]} 
     resources { srcDirs = [ 
       '../projectA/src/main/resources' 
      ]} 
    } 
    test { 
     java { 
      srcDirs = [ 
       '../projectA/src/test/java', 
       'src/test/java' 
      ]} 
     resources { 
      srcDirs = [ 
       '../projectA/src/test/resources', 
       'src/test/resources' 
      ]} 
    } 
} 

compileJava { 
    source sourceSets.mainProjectB.allJava 
    source sourceSets.mainProjectA.allJava 
} 

processResources { 
    from sourceSets.mainProjectB.resources 
    from sourceSets.mainProjectA.resources 
} 

jar { 
    from sourceSets.mainProjectB.output.classesDir 
    from sourceSets.mainProjectB.output.resourcesDir 
} 

問題:カスタムのsourceSet mainProjectB ingores指定された出力ディレクトリ私は別のディレクトリに出力を持つようになっているカスタムのsourceSet mainProjectBを定義しました。 "$ buildDir/build/classes/projectB"と "$ buildDir/build/resources/projectB"というディレクトリは作成されないため、ProjectBの代わりに両方のプロジェクトのファイルがJARに含まれます。

更新日:
プロジェクトAとBは循環依存関係があります。そのため、彼らはソースコードを共有する必要があります。

+0

projectAとprojectBの内容をマージするjarファイルを作成しようとしていますか? – Ethan

+0

いいえ:ProjectBのクラスとリソースを持つJAR – isobretatel

答えて

0

私はあなたの目標を達成するためにサブプロジェクトとプロジェクトを使用することを考えます - gradel docs。次のアプローチを使用すると、ビルドに応じて、jarファイルの任意の種類を取得することができます:

group 'CoreProject' 
version '1.0-SNAPSHOT' 
subprojects { 
    apply plugin: 'java' 
    repositories { 
     mavenCentral() 
    } 
} 

project (':projectA') { 

} 

project (':projectB') { 
    def generatedResources = "$buildDir" 
    //in case you want resources and classes to be written to custom location where 
    //redefined paths are relative to projectB root folder 
    sourceSets { 
     main { 
      output.classesDir = 'build/classes/projectB' 
      output.resourcesDir = 'build/resources/projectB' 
     } 
    } 
    dependencies { 
     compile project(':projectA') 
    } 
    jar { 
     manifest.mainAttributes(
       'Main-Class': "ProjectBClass" 
     ) 
    } 

    //To create fat Jar that will contain classes and resources from all dependencies 
    task fatJar(type: Jar) { 
     manifest.from jar.manifest 
     classifier = 'all' 
     from { 
      configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } 
     } { 
      exclude "ProjectAResource" //if want to exclude resources from projectA 
      exclude "META-INF/*.SF" 
      exclude "META-INF/*.DSA" 
      exclude "META-INF/*.RSA" 
     } 
     with jar 
    } 
} 

をあなたは、ProjectBの以下のjarファイルのが作成されるだけで、独自のクラスおよびリソースを含む各のjarタスクを実行する場合:PROJECTA /build/libs/projectA.jarProjectBの/ビルド/ libsに/ projectB.jar(あなたのコメントで尋ねとして 'ProjectBのからクラスとリソースを持つJAR')あなたはfarJarタスクを実行する場合

projectBのは、両方のプロジェクトのクラスとリソースを含む次のjarファイルが作成されます。プロジェクトB/build/libs/projectB-all.jarの最終ジャーを作成するために、projectAプロジェクトBおよびprojectBプロジェクトからファイルパターンを除外できます。ここで

は、私は(私はそれを理解できるように)あなたのシナリオを模倣するために作成したプロジェクトのフォルダ構造のスクリーンショットです: enter image description here

PSまた、プロジェクトB /ビルドとプロジェクトA /ビルドのいずれのフォルダもプロセスによってロックされていないことを確認し、もしあればそれらのハンドルを削除します。そうでない場合、Gradleは実行に失敗します。

+0

プロジェクトAとBは循環依存関係を持っています。そのため、ソースコードを共有する必要があるため、私のユースケースではあなたのアプローチはうまくいかないでしょう。 – isobretatel

関連する問題