2017-09-15 49 views
1

我试图在Java中实现一个protoc插件。由于CLASSPATH不能传递给protoc,因此这需要独立的自动执行罐。如何使用Gradle创建一个独立的自动执行的jar文件?

我发现了很多关于如何创建自动执行的jar的文章(例如http://en.newinstance.it/2012/04/17/self-executing-jar-files/)。但是,无论如何,都要考虑与自执行jar一起捆绑的依赖关系。这意味着自动执行的jar不是独立的。如何才能做到这一点?

+1

可能相关:https://stackoverflow.com/q/3445825/1531971 – jdv

+0

是,这是相关但不足。问题是一个jar不能有一个'CLASSPATH'来引用它自己内部的jar。 –

+0

哦,对。这是响亮的一些钟声。作为一名Gradle牧牛人是不讨好的。 – jdv

回答

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" "[email protected]"') 
    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用于创建尤伯杯-罐。
  • com.example.Main是执行的Java入口点。
  • 指定classifier对于protoc Gradle插件(其中默认包含classifier中的操作系统)更多,不是严格需要。已发布的protoc插件的客户端必须使用版本0.8.3及更高版本的protoc Gradle插件,该插件支持覆盖classifier
  • createJarExe使用尤伯杯罐子,如下http://en.newinstance.it/2012/04/17/self-executing-jar-files/#
  • wire the dependencies确保尤伯杯罐子分配之前创建
相关问题