首页 文章

在胖JAR中包含来源

提问于
浏览
3

我将Gradle用于一个简单的Java项目,并希望生成一个包含源代码的胖JAR .

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

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

我可以 Build 这个:

./gradlew clean build shadowjar

这会在 build/libs 目录中生成两个JAR文件:

  • example-fat.jar - 没有来源的胖JAR

  • example.jar - 具有(仅)源的JAR

Gradle Shadow plug-in的文件说明了这一点

在存在java或groovy插件的情况下,Shadow将自动配置以下行为:[...]配置shadowJar任务以包含项目主sourceSet中的所有源 .

对我来说,这意味着源包含在生成的JAR中,但这可能不是它的含义 .

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

1 回答

  • 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!")
        }
    }
    

相关问题