我已经安装了一个应用程序,当我试图运行它(它是一个可执行的jar)什么都没有发生。当我从命令行运行它时:

Java -jar "app.jar"

我得到了以下信息:

在“app.jar”中没有主清单属性

通常,如果我自己创建了这个程序,我就会向清单文件添加一个主类属性。但在这种情况下,由于文件来自应用程序,我不能这样做。我还尝试提取jar,看看是否能找到主类,但有很多类,没有一个在它的名称中有“main”这个词。必须有一种方法来修复这个问题,因为程序在其他系统上运行良好。


当前回答

任何可执行的jar文件都应该通过点击或使用命令提示符运行,如java -jar app.jar(使用“如果jar路径包含空格”-即java -jar“C:\文件夹名称\app.jar”)。如果您的可执行jar没有运行,这意味着它没有正确创建。

为了更好地理解,提取jar文件(或使用任何工具查看,对于windows 7-Zip是一个很好的工具),并检查/META-INF/MANIFEST.MF下的文件。如果你找到任何条目

Main-Class: your.package.name.ClaaswithMain -那么它就可以了,否则你必须提供它。

注意在MANIFEST上附加Main-Class条目。MF文件,检查你在哪里保存它!

其他回答

Gradle的答案是添加一个jar/manifest/attributes设置,像这样:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

如果jar不遵守规则,它就不是一个可执行的jar。

因为您已经添加了MANIFEST。MF,我认为你应该考虑这个文件中Field的顺序。我的env是java版本“1.8.0_91”

还有我的舱单。MF为这里

// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing

// run
~ java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar

然而,这如下所述

Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)

//this run swing normally

这应该是java -jar app.jar而不是java -jar "app"。

只有当JAR文件是可执行JAR文件时,-jar选项才有效,这意味着它必须有一个带有Main-Class属性的清单文件。参见在JAR文件中打包程序以了解如何创建可执行JAR。

如果它不是一个可执行的JAR,那么你需要像这样运行程序:

java -cp app.jar com.somepackage.SomeClass

其中com.somepackage.SomeClass是包含运行程序的主方法的类。(这个类是什么取决于程序,不可能从您提供的信息中判断出来)。

只需将其添加到java模块的build.gradle中。它将创建可执行jar。 它将包含存档中的依赖库。

jar {
  manifest { 
    attributes "Main-Class": "com.company.application.Main"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

这将导致[module_name]/build/libs/[module_name].jar文件。 我用shell进行了测试。