在fat JAR中包含源代码

5
我正在一个简单的Java项目中使用Gradle,并希望生成一个包含源代码的单一的fat 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 - 不带源代码的fat JAR
  • example.jar - 仅包含源代码的JAR

Gradle Shadow插件的文档说明了以下内容:

在使用javagroovy插件时,Shadow会自动配置以下行为:

[...]

  • 配置shadowJar任务以包括项目主要sourceSet中的所有源。

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

是否可以从Gradle生成一个包含源代码的可执行fat JAR?

1个回答

1

我不确定shadowJar如何处理源代码,但是你可以自己实现一个fat 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”不包含任何源代码。我已将最新版本推送到https://github.com/szarnyasg/gradle-shadowjar-source。 - Gabor Szarnyas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接