在 fat JAR 中包含源
Posted
技术标签:
【中文标题】在 fat JAR 中包含源【英文标题】:Include sources in 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 的文档指出
在存在
java
或groovy
插件的情况下,Shadow 会 自动配置以下行为:[...]
将shadowJar
任务配置为包括来自 项目的主要 sourceSet。
对我来说,这意味着源包含在生成的 JAR 中,但这可能不是它的意思。
是否可以从 Gradle 生成可执行的 fat 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 ***es 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以上是关于在 fat JAR 中包含源的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 IntelliJ 制作具有所有依赖项的 jar 文件,也就是 Fat jar
Executable Jar/Uber Jar/Shade Jar/Shadow Jar/Fat Jar 到底是什么东西?
Gradle:获取传递依赖项并导出到最小的运行时 fat jar
运行 Spring Boot fat-jar 时如何覆盖 Java 资源?
收到一个主 jar 文件,其中包含需要在类路径中的其他 jar 文件。在我的 Maven 项目中包含这个主 jar 的最佳方法是啥?
使用 Sbt-native-packager 将 fat.jar + 外部文件创建到单个 tar.gz 文件中以在我的 Nexus 上发布