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

Java -jar "app.jar"

我得到了以下信息:

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

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


当前回答

创建文件夹META-INF和文件MANIFEST。MF在该文件夹中,内容如下:

Manifest-Version: 1.0
Class-Path: .
Main-Class: [YOUR_MAIN_CLASS]

然后编译,包括该清单文件。

其他回答

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

apply plugin: 'java'

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

以上答案对我来说只是部分帮助。java -cp是答案的一部分,但我需要关于如何识别要运行的类的更具体的信息。以下是对我有效的方法:

步骤1:找到我需要运行的类

jar tf /path/to/myjar.jar | more

结果最上面的几行是:

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

App.class包含了要运行的主类。我不能百分之百确定你是否总是认为你需要的课程是第一个,但它是为我。如果不是,我想使用grep排除与库相关的结果以将类列表缩减到可管理的大小并不太难。

接下来就很简单了:我只需要使用该路径(减去“.class”后缀):

java -cp /path/to/myjar.jar somepath/App

对我来说,没有一个答案真的有帮助-我在正确的地方有清单文件,包含主类和所有东西。让我跌倒的是:

警告:要从中创建清单的文本文件必须 以新行或回车结束。最后一行不会 如果不以新行或回车符结束,则正确解析。

(来源)。在清单的末尾添加换行符可以解决这个问题。

如果使用Maven,请在pom中包含以下内容

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我和你有相似的问题, 在下面的语法中成功创建。war文件:-

Jar {cvf} [Jar -file] [manifest-file]

清单 当创建(c)或更新(u) JAR文件时,manifest操作数用要包含在manifest中的属性的名称和值定义先前存在的清单文件。MF在JAR文件中。如果f选项'[1]'存在,则必须指定清单操作数。

为了创建清单文件,你需要为某些属性定义一个值,你可以在(.WAR)文件名后面加上星号,以避免创建清单文件:-

罐子 -cvf foo.war *

老实说,我不知道这是否是一个最好的做法,但它为我工作:)。