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

标签 java gradle

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

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

最佳答案

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

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 用于创建 uber-jar。
  • com.example.Main 是执行的 Java 入口点。
  • 指定classifier更多的是针对protoc Gradle插件(默认情况下在classifier中包含操作系统),并不是严格需要的。已发布的 protoc 插件的客户端必须使用 0.8.3 或更高版本的 protoc Gradle 插件,该插件支持覆盖分类器
  • createJarExe 使用 uber-jar 并遵循 self-executing JAR 上的帖子文件
  • 连接依赖项确保在分发之前创建 uber-jar

关于java - 如何使用 Gradle 创建独立的自执行 jar 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244560/

相关文章:

java - 陈旧元素异常、元素不可点击、元素点击被拦截且没有此类元素错误显示,由同一元素交替显示

java - TestNG 中的非静态驱动程序和屏幕截图监听器

java - 我正在使用gradle但我将错误作为构建失败

android - gradle> Task:app:externalNativeBuildDebug FAILED android_gradle_build.json(没有这样的文件或目录)

android-studio - LibGDX Gradle任务可以在jar中导出android项目

java - Jackson Unmarshalling 未提供的值

java - 无法弄清楚为什么 System.out.println 不起作用

java - javax.ejb.SessionSynchronization 和 javax.transaction.Synchronization 之间的区别

java - 我需要采取哪些步骤才能将我的 Eclipse Android 项目转换为 Gradle 项目?

caching - 如何更改 Gradle 工件缓存的生存时间?