【问题标题】:How to solve Error: Invalid or corrupt jarfile如何解决错误:jarfile 无效或损坏
【发布时间】:2019-12-04 14:04:32
【问题描述】:

我有一个用于 HelloWorld 的 Intellij Gradle 项目。该程序在 IDE 中运行,但运行 jar 文件时出现无效或损坏的 jar 错误。我对 build.gradle 和 Manifest 进行了一些更改,但仍然无法运行。我使用的是 Ubuntu 16.04。

我认为问题与清单有关。

IDE -

Intellij - 2019.2 Gradle 项目

Java - java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

build.gradle -

plugins {
    id 'java'
}

group 'com.HelloWorldTesting'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

jar {
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    manifest {
        attributes(
                'Implementation-Title': 'Hello World',
                "Main-Class": "com.HelloWorldTesting.Hello"
        )
    }
    archivesBaseName = 'app'
}

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

类-

public class Hello {
    public static void main(String[] args) {
        // Prints "Hello, World" to the terminal window.
        System.out.println("Hello, World");
    }
}

错误:无效或损坏的 jarfile HelloWorldArt.main.jar

树 -

. ├── 建造 │   ├── 类 │   │   └── java │   │   └── 主要 │   │   └── Hello.class │   └── tmp │   └── compileJava ├── build.gradle ├── 毕业 │   └── 包装 │   ├── gradle-wrapper.jar │   └── gradle-wrapper.properties ├── 毕业 ├── gradlew.bat ├── META-INF │   └── MANIFEST.MF ├──出 │   └── 文物 │   ├── HelloWorldArt_jar │   │   └── HelloWorldArt.jar │   └── HelloWorldArt_main_jar │   └── HelloWorldArt.main.jar ├── settings.gradle ├── 源 │   ├── 主要 │   │   ├── java │   │   │   ├── Hello.java │   │   │   └── META-INF │   │   │   └── MANIFEST.MF │   │   └── 资源 │   └── 测试 │   ├── java │   └── 资源

【问题讨论】:

  • 你可以尝试从 gradle 的 jar 部分中的 {configurations.runtimeClasspath.collect...} 中删除吗?
  • @Sambit - 更改后出现同样的错误。
  • 重新创建 JAR 文件。
  • @user207421 现在可以工作了,问题是两个清单文件。

标签: java gradle intellij-idea intellij-13


【解决方案1】:

在您的清单中,您已将主类定义为com.HelloWorldTesting.Hello。 查看您的项目树,我可以看到 Hello.java 类位于您的源文件夹根目录中,并且不在包 com.HelloWorldTesting 中。

尝试像这样设置你的主类: "Main-Class": "Hello"

您的 src 文件夹中还有一个清单文件并且您正在使用 gradle 生成清单:

manifest {
    attributes(
            'Implementation-Title': 'Hello World',
            'Main-Class': 'Hello'
    )
}

拥有多个清单文件会导致这种意外行为。从源文件夹中删除清单,运行gradle clean,然后构建应该可以工作了。

【讨论】:

  • 同样的错误 - 更多细节 - trevor@trevor-Lenovo-YOGA-510-14AST:~/decent/HelloWorldArt$ find ./ -name MANIFEST.MF ./src/main/java/META- INF/MANIFEST.MF ./META-INF/MANIFEST.MF trevor@trevor-Lenovo-YOGA-510-14AST:~/decent/HelloWorldArt$ more ./META-INF/MANIFEST.MF Manifest-Version: 1.0 Main-Class : 你好 trevor@trevor-Lenovo-YOGA-510-14AST:~/decent/HelloWorldArt - 不确定空白行是否对最后的清单有影响。
  • 你试过没有“from”和“archivesBaseName”的最基本版本的jar任务吗? jar { manifest { attributes 'Main-Class': 'Hello' } }
  • 另外,如果你用 gradle 生成它,为什么你的 src 文件夹中有一个清单?
  • Michael Kleinmann - 我将 Build Artifact 项目结构中的目录指定为 src 目录,这是 Intellij 的默认设置。我应该改变这个吗?正如我在上面发布的那样,它现在似乎有两个清单。我认为这可能是一个问题。
  • 好的,我不知道这些 IntelliJ 默认值。我刚刚在 IntelliJ 中创建了一个新的 gradle 项目,在 src/main/java 下添加了 Hello 类,并在 build.gradle 中配置了 jar 任务,如下所示:jar { manifest { attributes 'Main-Class': 'Hello' } } 它构建并运行没有任何问题,所以我会说你需要从 src 文件夹中删除清单,因为您使用 gradle 生成它。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2021-11-23
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多