当前位置: 首页 > 知识库问答 >
问题:

在脂肪罐中包括来源

洪德寿
2023-03-14

我将Gradle用于一个简单的Java项目,并希望生成一个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-没有源的胖JAR
  • example.jar-一个(仅)包含源的JAR

Gradle Shadow插件的文档说明

如果存在javagroovy插件,Shadow将自动配置以下行为:

[...]

  • shadowJar任务配置为包含项目主源集中的所有源

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

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

共有1个答案

宰父飞翼
2023-03-14

我不是100%确定如何阴影罐处理源,但您可以滚动自己的胖罐实现。

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!

为了完整起见,这里是我的你好。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!")
    }
}
 类似资料:
  • 我对Gradle和shadow jar(Maven的Shade插件的Gradle版本)是新手。我正在构建一个胖jar,我想在其中合并服务文件(这就是我首先使用shadowjar的原因)。根据文档,shadowJar任务继承自gradle Jar任务。因此,我们可以假设它将完全像jar任务一样工作。 下面是jar任务的片段: 结果,它产生了一个脂肪罐与所有的依赖关系爆炸,什么是预期的。当我将任务名称

  • 我在Java 8应用程序中使用了处理,它在IntelliJ上运行良好。Gradle导出所有平台的fat jar(下面的代码)打包依赖项后出现问题: 每当我试图打开扩展PApplet的窗口时,它都会引发以下异常: 通用域名格式。约甘普。opengl。GLException:配置文件[GL4bc、GL4、GL3bc、GL3、GLS3、GL2、GLS2]在设备窗口GraphicsDevice[type.

  • 我正在用Spring Boot,Jpa和MySQL连接器编写java控制台应用程序。我怎样才能轻松地排除所有不必要的脂肪从我的脂肪罐?

  • 我使用JarSplice创建了一个胖jar文件,但是当我启动它时,我得到一个窗口(大小可以),它在半秒后关闭。。。 在“addjars”部分中,我添加了从Eclipse导出的jar文件,以及我正在使用的所有库jar。在本机部分,我只为lwjgl添加Windows本机。我想我写了正确的主类。 我做错了什么?我怎样才能解决这个问题? 注意:我使用的是最新版本的eclipse和jdk。

  • 我知道不是一个有效的阶段,但我只是想说明我试图完成什么,即只有在提供选项时才构建fat jar的条件安装。

  • 我有一个使用spark的scala多项目,并尝试使用sbt插件sbt-assembly 0.14.3来制作一个胖罐子。我的建筑。SBT看起来像这样: 我想创建一个子项目的fat jar,以便这个fat jar包含项目核心的所有库和代码。我尝试了以下方法: