如何使用Gradle创建一个独立的自执行jar文件?

时间:2017-09-15 17:08:19

标签: java gradle

我试图在Java中实现一个protoc插件。这需要一个独立的自执行jar,因为CLASSPATH无法传递给protoc

我发现很多文章都在谈论如何创建一个自动执行的jar(例如http://en.newinstance.it/2012/04/17/self-executing-jar-files/)。但是,没有考虑到依赖项与自执行jar的捆绑。这意味着自动执行的jar不是独立的。怎么办呢?

1 个答案:

答案 0 :(得分:0)

以下内容是从现有项目中复制而来的,可能会使用一些未包含在代码段中的内容(例如星云插件):

apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'

mainClassName = 'com.example.Main'

jar {
  manifest {
    attributes 'Main-Class': 'com.example.Main'
  }
}

publishing {
  publications {
    nebulaIvy(IvyPublication) {
      artifact(tasks.findByName('createJarExe').outputs.getFiles().getSingleFile()) {
        classifier '_-jdk8'
        extension 'exe'
        type 'exe'
      }
    }
  }
}

task createJarExe(dependsOn: installShadowDist) {
  final outputFile = file("${buildDir}/install/${project.name}-shadow/bin/${project.name}-${project.version}.exe")

  doLast {
    outputFile.text = '#!/bin/bash\n'
    outputFile.append('exec java -jar "$0" "$@"')
    outputFile.append(inputs.files.first().readBytes())
    outputFile.setExecutable(true)
  }

  inputs.files "${tasks.findByName('installShadowDist').outputs.getFiles().getSingleFile()}/lib/${project.name}-${project.version}-all.jar"
  outputs.file outputFile
  doFirst {
    mkdir outputFile.getParent()
  }
}

// wire the dependencies
tasks.whenTaskAdded { task ->
  if (task.name == 'publishNebulaIvyPublicationToDistIvyRepository') {
    task.dependsOn('createJarExe')
  }
}

注意:

  • com.github.johnrengelman.shadow用于创建超级jar。
  • com.example.Main是执行的Java入口点。
  • classifier Gradle插件(默认情况下包含protoc中的操作系统)指定classifier更多,并且不是必需的。已发布的protoc插件的客户端必须使用0.8.3 Gradle插件的版本protoc及更高版本,该插件支持覆盖classifier
  • createJarExe使用uber-jar并遵循http://en.newinstance.it/2012/04/17/self-executing-jar-files/#
  • wire the dependencies确保在分发之前创建超级jar