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

用Gradle:shadow插件构建Spark-fat-jar生成损坏的jar文件

皇甫伟彦
2023-03-14

我正试着用格雷德做一个火花罐。构建成功,但文件以一种微妙的方式损坏:尝试运行它会产生:

Error: Could not find or load main class shadow_test.Main
Caused by: java.lang.ClassNotFoundException: shadow_test.Main

不过JAR本身看起来很好:缺少的类就在那里,当我解压它时,我可以很好地运行项目。

这是gradle.build文件:

plugins {
    id "scala"
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

ext {
    ver = [
            scala   : '2.11.12',
            scala_rt: '2.11',
            spark   : '2.4.4'
    ]
}

configurations {
    // Dependencies that will be provided at runtime in the cloud execution
    provided

    compileOnly.extendsFrom(provided)
    testImplementation.extendsFrom provided
}

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.scala-lang:scala-library:$ver.scala"

    provided "org.apache.xbean:xbean-asm6-shaded:4.10"
    provided "org.apache.spark:spark-sql_$ver.scala_rt:$ver.spark"
    provided "org.apache.spark:spark-hive_$ver.scala_rt:$ver.spark"

    testImplementation "org.testng:testng:6.14.3"
}

tasks.register("allJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    manifest {
        attributes "Main-Class": "shadow_test.Main"
    }

    from sourceSets.main.output
    configurations = [project.configurations.runtimeClasspath, project.configurations.provided]

    zip64 true

    mergeServiceFiles()

    with jar
}

test {
    useTestNG()
}


Gradle版本是7.3.3

再现此问题的最小项目的完整代码可以在https://github.com/SashaOv/shadow-jar-repro

谢谢你的线索

共有1个答案

齐冥夜
2023-03-14

该问题由Gradle社区解决:https://discuss.gradle.org/t/possible-to-build-spark-fat-jar-with-gradle/42235/2?u=sashao

我遗漏了签名文件的例外情况:

exclude 'META-INF/*.DSA'
exclude 'META-INF/*.SF'
 类似资料:
  • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl

  • 问题内容: 在将Maven jFree依赖项添加到现有应用程序后,我将无法执行创建的jar。 我收到的唯一错误消息如下: 完整的外观如下所示: 如果执行jar,则不会得到其他任何调试信息。 是否可以验证jarfile?或有类似…的东西? 重现步骤: 新建一个文件夹 从上方将Pom.xml复制到该文件夹​​中。 保存小的`public static void main(…)。进入src / main

  • 问题内容: 在构建战争文件时,我正在将一组罐子从某个位置复制到战争中的文件夹中。虽然文件确实会被复制,但是我认为它们已损坏,因为在战争之外被带出的jar的相同类文件会使用调试器打开,而从war文件中取出后不会打开。 这是我的战争pom.xml的一部分,我在其中复制了罐子 SomeSourceDirectory 有一些jar和其他文件结果是:myWar / somefolder / a.jar,但是

  • HTSJDK是一个用于访问常见文件格式(如SAM和VCF)的库。我想构建HTSJDK JAR。在文档页面中说我必须为此使用Ant。所以我安装了Ant并运行以下命令: ant htsjdk-jar [javac]用法:javac [javac]use-help获取可能选项列表 生成失败 build.xml文件有问题。这里是文件的开头: 拜托,有人能告诉我该怎么做才能解决这个问题吗?

  • 我通过spring-boot-maven-plugin(V1.3.6)创建完全可执行的jar,方法如下: 当我从目标目录启动类似于可执行文件的结果jar(类似于“./app.jar”,而不是通过“java-jar app.jar”)时,应用程序可以正确地启动和工作,但是如果我将此jar复制到另一个目录,我会得到错误:“无效或损坏的jar文件/home/user/spring”。(我使用Linux

  • 我在一个Java项目上工作,我想把它的测试转换成Scala。我看到用sbt打包整个项目jar可能更方便,而不是用Maven。 有什么方法可以让我拥有一个xxx.sbt文件,并运行一个/多个sbt命令,以获得相同的效果吗?