2016-11-22 63 views
2

我使用Gradle作为简单的Java项目,并且希望生成一个包含源代码的单个胖JAR。在胖JAR中包含源码

我准备了一个示例存储库:https://github.com/szarnyasg/gradle-shadowjar-source。我想这build.gradle配置:

./gradlew clean build shadowjar 

这导致两个JAR文件中build/libs目录:

  • example-fat.jar - 无来源脂肪JAR

    plugins { id "com.github.johnrengelman.shadow" version "1.2.4" } 
    
    apply plugin: 'java' 
    
    shadowJar { 
        classifier = 'fat' 
        manifest { attributes 'Main-Class': 'org.example.MyMain' } 
    } 
    
    task packageSources(type: Jar) { 
        from sourceSets.main.allSource 
    } 
    
    artifacts.archives packageSources 
    

    我可以建立这个(仅限于)

Gradle Shadow plug-in的文档指出

javagroovy插件的存在,暗影将 自动配置以下行为:

[...]

  • 配置shadowJar任务以包含来自的所有来源项目的主要源码集。

对于我来说,这意味着源包括在生成的JAR,但是这可能不是这个意思。

可以从Gradle生成一个可执行的胖JAR,它也包含源代码?

回答

1

我不是100%确定shadowJar如何处理来源,但你可以推出自己的胖jar实现。

apply plugin: 'groovy' 

repositories { 
    jcenter() 
} 

version = "0.1" 
group = "com.jbirdvegas.so" 

dependencies { 
    // some dependencies to show the use case 
    compile localGroovy(), 'org.slf4j:slf4j-api:1.7.21', 'org.slf4j:slf4j-simple:1.7.21' 
    testCompile 'junit:junit:4.12' 
} 

jar { 
    // set manifest 
    manifest.attributes 'Implementation-Title': 'Executable fat jar', 
      'Implementation-Version': version, 
      'Main-Class': 'com.jbirdvegas.q40744642.Hello' 
} 

task fatJar(type: Jar) { 
    // baseName must be unique or it clashes with the default jar task output 
    baseName = "$project.name-fat" 
    // make sure you have a valid manifest 
    manifest = jar.manifest 
    // Here put the source output (class) files in the jar 
    // as well as dependencies (jar) files. 
    from sourceSets.main.output, 
      configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
} 

// make sure our fatJar always runs immediately after the jar task 
jar.finalizedBy fatJar 

现在,jar任务执行后,我们有一个准备去可执行的JAR

$ java -jar build/libs/q40744642-fat-0.1.jar 
[main] INFO com.jbirdvegas.q40744642.Hello - Hello World! 

的完整性,这里是我Hello.groovy

package com.jbirdvegas.q40744642 

import org.slf4j.Logger 
import org.slf4j.LoggerFactory 

class Hello { 
    static main(args) { 
     Logger logger = LoggerFactory.getLogger(Hello.class) 
     logger.info("Hello World!") 
    } 
} 
+0

感谢您的回答。我删除了Groovy相关的部分,并在'gradle clean fatJar'的存储库上尝试了它,但生成的'example-fat-0.1.jar'不包含任何源代码。我将最新版本推送到https://github.com/szarnyasg/gradle-shadowjar-source –