【问题标题】:Include sources in fat JAR在 fat JAR 中包含源
【发布时间】:2017-04-06 07:01:22
【问题描述】:

我将 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

我可以用:

./gradlew clean build shadowjar

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

  • example-fat.jar - 没有来源的胖 JAR
  • example.jar - 带有(仅)源的 JAR

Gradle Shadow plug-in 的文档指出

在存在javagroovy 插件的情况下,Shadow 会 自动配置以下行为:

[...]

  • shadowJar 任务配置为包括来自 项目的主要 sourceSet。

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

是否可以从 Gradle 生成可执行的 fat JAR,其中还包含源代码?

【问题讨论】:

    标签: gradle jar shadowjar


    【解决方案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!")
        }
    }
    

    【讨论】:

    • 感谢您的回答。我删除了与 Groovy 相关的部分,并在我的存储库中使用 gradle clean fatJar 进行了尝试,但生成的 example-fat-0.1.jar 不包含任何源代码。我把最新版本推送到github.com/szarnyasg/gradle-shadowjar-source
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多