我正在尝试在 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/