9

Gradleは複数のプロジェクトを1つのjarにjarできますか?

私はあなたがこのような方法を使って単一のプロジェクトのためにそれをすることができることを知っています:

task packageTests(type: Jar) {
  from sourceSets.test.classes
}

しかし、人はどのようにして複数のサブプロジェクトを1つのjarファイルに圧縮するのでしょうか。

私はこれを試しましたが、機能しません:

task packageTests(type: Jar) {
  from project(':core').sourceSets.main.classes
  from project(':core:google').sourceSets.test.classes
  from project(':core:bing').sourceSets.test.classes
}
4

4 に答える 4

8

これはあなたがやりたいことのために働くはずです。これはルートgradleビルドファイルにあるはずです。

subprojects.each { subproject -> evaluationDependsOn(subproject.path)}

task allJar(type: Jar, dependsOn: subprojects.assemble) {
   baseName = 'your-base-name'
   subprojects.each { subproject -> 
      from subproject.configurations.archives.allArtifacts.files.collect {
         zipTree(it)
       }
    }
 }

これをアーカイブとして追加することで公開できます。

artifacts {
   archives allJar
}
于 2012-12-10T20:15:01.693 に答える
8

これが私の解決策です。これは少し簡単です。

// Create a list of subprojects that you wish to include in the jar.  
def mainProjects = [':apps',':core',':gui',':io']
task oneJar( type: Jar , dependsOn: mainProjects.collect{ it+":compileJava"}) {
    baseName = 'name of jar'
    from files(mainProjects.collect{ project(it).sourceSets.main.output })
}

コードはGradle1.12でテストされています

于 2014-06-30T19:10:58.337 に答える
4

次のソリューションは、CaTalyst.Xによって提案されたものと非常に似ていますが、 jarタスクを直接使用します。

subprojects.each { subproject -> evaluationDependsOn( subproject.path ) }
jar.dependsOn subprojects.tasks['classes']
jar {
  baseName = 'MyApp'
  manifest {
    attributes 'Main-Class': 'org.abc.App'
  }
  subprojects.each { subproject ->
    from subproject.sourceSets.main.output.classesDir
    from subproject.sourceSets.main.output.resourcesDir
  }
}

Gradle2.1および2.2.1に対してテストされました

于 2014-12-15T20:29:27.207 に答える
1

私はこれが答えられたことを知っていますが、答えは古く(現在のGradleバージョンはいくつかのメジャーバージョンより新しい-6.2.2)、このスレッドは検索エンジンに非常に高く表示されるので、私のために働いた解決策を投稿します。

一般的に、私の問題は元の投稿で述べられているものと似ています/同じです:すべてのサブプロジェクトからクラスを取得して1つのjarに圧縮したかった(できれば可能な限りデフォルト設定を使用して)。最後に、次のコードでうまくいくことがわかりました。

jar {
  from subprojects.sourceSets.main.output
}

しかし、jarを適切にビルドする一方で、このjarをすべてのサブプロジェクトが行うすべてに依存する単一のアーティファクトとしてMavenリポジトリーに公開できるようにしたかったのです。これを実現するには、メインプロジェクトはサブプロジェクトの依存関係に依存する必要があります。これは次の方法で行われます。

subprojects.each { evaluationDependsOn(it.path) }
dependencies {
  api(externalSubprojectsDependencies('api'))
  implementation(externalSubprojectsDependencies('implementation'))
}
private externalSubprojectsDependencies(String configuration) {
  subprojects.collect { it.configurations[configuration].allDependencies }.flatten()
      .findAll { !it.properties['dependencyProject'] } // this looks like hack, I'd love to see better solution
}

外部の依存関係のみがコピーされpom.xmlます-とにかくすべてのクラスがjarにあるため、内部(プロジェクト)の依存関係をリストする必要はありません。

于 2020-03-06T11:39:57.473 に答える