Java Gradle可以将多个项目放入一个jar中吗?

Java Gradle可以将多个项目放入一个jar中吗?,java,build,gradle,Java,Build,Gradle,Gradle可以将多个项目放入一个jar中吗 我知道您可以使用以下方法为单个项目执行此操作: task packageTests(type: Jar) { from sourceSets.test.classes } 但是一个人如何将多个子项目压缩到一个jar中呢 我试过这个,但不起作用: task packageTests(type: Jar) { from project(':core').sourceSets.main.classes from project(':core:

Gradle可以将多个项目放入一个jar中吗

我知道您可以使用以下方法为单个项目执行此操作:

task packageTests(type: Jar) {
  from sourceSets.test.classes
}
但是一个人如何将多个子项目压缩到一个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
}

这应该适用于你想做的事情。这应该在根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
}

这是我的解决方案,简单一点:

// 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 })
}

代码已经在Gradle 1.12上进行了测试,下面的解决方案与提出的非常类似,但直接使用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
  }
}

它是针对Gradle 2.1和2.2.1进行测试的,我知道这已经得到了回答,但由于答案是旧的(当前的Gradle版本是一些较新的主要版本-6.2.2),并且这个线程在搜索引擎中显示得相当高,我将发布适合我的解决方案

一般来说,我的问题与原始帖子中的问题相似/相同:我希望从所有子项目中获取类,并将它们压缩到一个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中。

您可以使用、OneJar或。所有3个都是特定于项目的。它们都不会压缩根项目及其所有子项目。所有这些项目都基于项目所应用的模型,其他项目作为依赖项。OneJar显然是一个压缩单个项目并将所有依赖项包含在.jar中的项目。对我来说,这并不能解决这个特殊的问题。“应用程序压缩”不起作用,因为GitHub已经为我做了。我试过fatJar,但指令不起作用,Gradle也无法编译我的脚本。将fatJar应用于您的项目所需的更改。只要运行
gradlefatjar
。这个答案几乎回答了我的问题。它给了我很多我尝试过的想法,但我从未解决过。gradle编译器给了我一个错误:在项目上找不到属性“Assembly”。我试着用各种方法来解决这个问题,但都做不到。我用的是Gradle1.2。我仍然充满希望,并且仍在努力。你可以尝试阅读Gradle的文档。听起来你好像是在复制和粘贴,什么都没用“汇编”是java插件提供给您的一个属性。如果您的一个子项目没有java插件,那么您将得到您提到的错误。我在“allprojects”部分添加了java插件。这对我所有的子项目都有效吗?在任何情况下,我都是专门为抱怨的项目添加java插件的,但没有任何帮助。今晚我将尝试在GitHub上提供一个更简单的示例,以获得更好的帮助。嗨,我是gradle的新手。gradle编译器在我尝试此操作时给出了错误。在根项目“Gradle root”上找不到参数[任务]:allJar“]的方法存档()。请帮助我有一个名为
buildRepackage
的任务,我想这就是这个任务的作用,但是我不能使一个jar在整个依赖项下都可以运行。你知道它们是如何协同工作的,以及我如何为spring boot应用程序完成这项工作的吗?我有一个名为
buildRepackage
的任务,我想这就是任务的作用,但我不能让一个jar在整个依赖项下都能运行。您知道它们是如何协同工作的吗?我如何为spring boot应用程序实现这一点?