【问题标题】:No main manifest attribute in .jar file.jar 文件中没有主要清单属性
【发布时间】:2020-07-28 17:58:54
【问题描述】:

我一直在查看几个不同的线程,但没有找到解决方案。我做了一个项目,它使用 java 和 gradle 从谷歌表格中检索数据。我已经创建了一个工件并通过 intelliJ 构建了 jar 文件。当我尝试使用“java -jar filename.jar”通过终端运行 jar 时,我得到“在 filename.jar 中没有主清单属性”

我的 MANIFEST.MF 位于 main/java/META-INF 并具有以下简单结构

Manifest-Version: 1.0
Main-Class: Main

build.gradle 文件结构如下:

plugins {
    id 'java'
}

group  'filename'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'com.google.api-client:google-api-client:1.30.4'
    compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4'
    compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0'
}

很明显,我已经在哪个类中说明了 main 方法,这就是为什么这个错误消息对我来说毫无意义。有人对此有解决方案吗?

【问题讨论】:

  • 你在 jar 的根目录下看到这个吗 -> META-INF/MANIFEST.MF(解压后)
  • 是的,我愿意。它包含大量信息。虽然没有关于主要课程的内容
  • 你在你的 gradle 文件中定义了这样的东西? jar { manifest { attributes( 'Main-Class': 'Main' ) } } ?
  • 如果我是正确的。这会在运行时创建另一个 jar.file 吗?我应该使用这个 jar 文件,而不是我通过 intelliJ 使用工件创建的那个吗?我的 build.gradle 文件中确实有这个。但是,使用该命令创建的 jar 文件不包含任何依赖项或类似内容。它只包含我项目中的文件,以及清单文件

标签: java google-sheets jar


【解决方案1】:

我已按照 Sheets API quickstart 中的步骤设置应用程序。之后,我按照其他 answer 的步骤生成 .jar 文件,说明您应该在 jar 属性内的 build.gradle 文件中声明清单文件。

在此之后,当运行生成的 .jar 文件时,我得到一个“无效的签名文件”错误,我可以通过在 jar 属性中添加以下行来修复该错误,如 here 所述:

exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'

生成 .jar 文件后,您可以在项目的build/libs 目录中找到它。我的结尾build.gradle 文件如下所示:

apply plugin: 'java'
apply plugin: 'application'

group 'egs'
version '1.0-SNAPSHOT'

mainClassName = 'SheetsQuickstart'
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'com.google.api-client:google-api-client:1.30.4'
    compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4'
    compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0'
}

jar {
    manifest {
        attributes 'Main-Class': 'SheetsQuickstart'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}

【讨论】:

  • 完美运行。谢谢!
猜你喜欢
  • 2018-02-10
  • 2021-05-29
  • 2015-10-01
  • 2022-12-23
  • 2021-11-02
相关资源
最近更新 更多