按需在Gradle中制作NON-FAT jar

时间:2016-08-30 10:28:18

标签: java gradle jar

我正在使用Gradle。通常我会构建FAT jar。没有问题,但此时,我还需要制作NON-FAT jar。 我的意思是我想要排除所有依赖的库并使用-cp选项运行jar,如下所示:

java -cp "/sample1/lib/myjar.jar:/sample2/lib/depended.jar" com.example.main.Runner

(在FAT jar中,java -jar myjar.jar是相同的,它包含depended.jar

这是我的build.gradle

apply plugin: 'java'
apply plugin: 'application'

jar.baseName = 'myjar'
version = ''
def mainClass = 'com.example.main.Runner'
mainClassName =  mainClass

def defaultEncoding = 'UTF-8'

repositories {
  flatDir dirs: "${projectDir}/libs"
}

dependencies {
  compile ':commons-chain:1.2'
  compile ':commons-io:2.4'

  testCompile ':junit:4.12'
  testCompile ':hamcrest-core:1.3'
}
jar {
  manifest {
      attributes 'Implementation-Version': version,
                 'Main-Class': mainClass
  }
  from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
}

我仍然想保留这个通常的FAT jar创建。 所以,我尝试添加如下任务:

尝试#1

task makeSlimJar {
  jar.baseName = 'myjar.slim'
  jar {
  manifest {
      // remove main class
      attributes 'Implementation-Version': version
  }
  from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
}

尝试#2

task makeSlimJar {
  jar.baseName = 'myjar.slim'  
  jar {
  manifest {
      // remove main class
      attributes 'Implementation-Version': version
  }
  from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}

  tasks.Jar.execute()
}

尝试#3

task makeSlimJar {
  jar.baseName = 'myjar.slim'
  jar {
  manifest {
      // remove main class
      attributes 'Implementation-Version': version
  }
  from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
  dependsOn Jar 
}

添加后,我运行了gradle makeSlimJar。 以上所有尝试都失败了(以编程方式,它已成功)并且只创建了名为myjar.slim.jar的FAT jar。

有没有办法在同一个build.gradle文件中共存FAT和NON-FAT jar? ......或者我错了什么?

我认为删除NON-FAT jar的apply plugin: 'application'是我的最后手段。

如果可以,请帮助我。

谢谢,

1 个答案:

答案 0 :(得分:2)

实际上将依赖项添加到jar中的代码就是这一行:

from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}

你的构建脚本通常会构建一个“超薄的jar”。默认情况下,除了您添加了代码以覆盖此行为:

jar {
  manifest {
  attributes 'Implementation-Version': version,
             'Main-Class': mainClass
  }
  from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
}

我建议删除这些行。当你运行gradle clean build时,这将构建一个普通的jar(没有依赖关系)。

然后,您可以添加一项额外任务来创建“胖子”'像这样:

task fatjar << {
    jar.doFirst {
       println "creating fatjar"
       jar {
         from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
       }
    }
}

您可以通过运行gradle clean fatjar build来使用此任务来构建fatjar。

或者你可以尝试查看一个框架,例如springboot,它可以为你完成所有这些。