无法执行jar文件:“无主清单属性”


969

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

java -jar“ app.jar”

我收到以下消息:

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

通常,如果我自己创建了程序,则应该在清单文件中添加一个main class属性。但是在这种情况下,由于文件来自应用程序,因此我无法做到这一点。我还尝试提取jar,以查看是否可以找到主类,但是有很多类,但它们中的任何一个都没有名称“ main”。由于该程序可以在其他系统上正常运行,因此必须有一种解决方法。


寻找主要方法;您不能依赖类名。
戴夫·牛顿

2
我知道,但是因为我只有.class文件,所以我看不到这些方法。可以吗
2012年

您不是真的在输入引号吗?无论如何,有很多方法可以查看方法,包括使用javap。您可能想取消压缩它,然后查看是否实际上没有清单。
戴夫牛顿

相关:有依赖关系:stackoverflow.com/a/23986765/360211
weston

如果我没有主类,因为我正在使用CommandLineJobRunner运行代码,怎么办
Kamini

Answers:


946

首先,看到您跑步java -jar "app"而不是跑步有点奇怪java -jar app.jar

其次,要使jar可执行文件,您需要将一个名为META-INF / MANIFEST.MF的文件打包

文件本身应该(至少)具有此衬纸:

Main-Class: com.mypackage.MyClass

com.mypackage.MyClass该类在哪里保存公共静态void main(String [] args)入口点。

请注意,使用CLI,Maven,Ant或Gradle有几种方法可以完成此操作:

对于CLI,将执行以下命令:(tks @ dvvrt jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

对于Maven来说,以下代码片段应该可以解决问题。请注意,这只是插件定义,而不是完整的pom.xml

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

(选择一个<version>适合您的项目的对象。)

对于Ant,以下代码片段应有所帮助:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

积分Michael Niemand-

对于Gradle

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

15
在Ant中,其<manifest> <属性名称=“ Main-Class” value =“ com.mypackage.MyClass” /> </ manifest>放在<jar>元素中
Michael Niemand

1
谢谢。只是想补充一点,您可以使用以下代码将依赖项复制到lib文件夹:stackoverflow.com/a/996915/1121497。由于类路径包含该lib文件夹,因此您只需要执行jar即可,java -jar myproject.jar它将找到依赖项。
Ferran Maylinch

4
如何“ jar一个名为META-INF / MANIFEST.MF的文件”?一方面我有一个.jar而另一方面是.MF,如何将它们链接在一起?我将清单和.jar放在同一文件夹中,但是它不起作用,我仍然遇到问题!
Wicelo 2014年

4
@Wicelo要在创建jar文件时指定特定的MANIFEST.MF文件,请对jar使用m标志。例如。 jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt 2014年

1
注意:对于Maven,我已经maven-jar-plugin在VSC生成的Maven文件中包含一个项目,因此我只在其中添加了该<configuration>部分。
亚伦弗兰克

279

那本来应该java -jar app.jarjava -jar "app"

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

如果它不是可执行的JAR,则您需要使用以下命令运行程序:

java -cp app.jar com.somepackage.SomeClass

哪里com.somepackage.SomeClass是包含main运行程序的方法的类。(该类的内容取决于程序,无法从您提供的信息中看出)。


3
感谢您的答复,但是您的解决方案只有在我知道包含main方法的类的名称的情况下才有效。这是一个错字……应该是“ app.jar”。但是,如何通过双击该文件解释为什么它在其他系统上运行?
2012年

如果确实是可执行的JAR,则可以提取清单文件(META-INF位于JAR文件内的目录中)。它应该包含一个Main-Class为您提供主类名称的属性。
杰斯珀(Jesper)2012年

如果它不能在一个系统上运行,则该系统可能具有太旧的Java版本。例如,如果JAR是用Java 7编译的,则不能在具有Java 6或更旧版本的系统上运行它。
杰斯珀(Jesper)2012年

这很有趣,因为另一个系统正在运行win7,而有问题的此计算机运行win8。
2012年

2
@Jesper您好,如果eclipse使用默认软件包怎么办?我只输入班级名称吗?
Ogen 2014年

127

另外,您可以使用maven-assembly-plugin,如以下示例所示:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

在此示例中,本节中指定的所有依赖项jar将自动包含在您的单个jar中。请注意,jar-with-dependencies应该按原样放置,而不是要包含的jar文件名替换。


3
完美,这可行。它将所有依赖项捆绑到一个jar中,从而使您可以编译/构建项目并立即使用它。
保罗

2
shade插件的上下文中,必须遵循Executable JAR的帮助。
koppor

3
这与maven-assembly-plugin工作。maven-jar-plugin没有。
MartynasJusevičius18年

注意:将此代码放在pom.xml文件内<build><plugins> PUT IT HERE </plugins></build>,然后执行maven包(在右侧的IDEA打开maven滑动菜单中,找到project> Lifecycle> package)。然后,您的jar文件将位于Target文件夹中。干杯!
Kirill Karmazin

我真的在这个问题上挣扎...这非常有效。谢谢!
jmojico

60

这是因为Java在MANIFEST.MF文件中找不到Main属性。Main属性对于告诉java应该使用哪个类作为应用程序的入口点是必需的。在jar文件中,MANIFEST.MF文件位于META-INF文件夹中。想知道如何查看jar文件中的内容?用WinRAR打开jar文件。

MANIFEST.MF内部的主要属性如下所示:

Main-Class: <packagename>.<classname>

当MANIFEST.MF文件中缺少此行时,您会收到此“无主清单属性”错误。

在MANIFEST.MF文件中指定此属性确实很麻烦。

更新:我刚刚找到了一种在eclipse中指定应用程序入口点的好方法。当您说导出时,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

在此处输入图片说明


32

我遇到过同样的问题。通过向pom文件添加以下行使其工作。该插件将使用所有必要步骤来确保您的应用程序的构建过程。

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

2
工作正常,但考虑添加截至2018年4月的版本<plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <version> 2.0.1.RELEASE < / version> </ plugin>
Tenflex

抱歉,但这不是解决方案,因为他不是在谈论Spring Boot,这是jar执行的普遍问题:)
LAMRIN TAWSRAS

非常感谢,这解决了Spring Boot的问题!
AleksandarT

我正在使用Spring Boot 2.2.0.Release。不幸的是,这种解决方案对我不起作用。但是,当您从<parent>...</parent>pom.xml中的应用程序引用时,它可以工作。我的猜测是,如果我们访问parent应用程序的pom.xml,我们将有一个清晰的主意。
tusar

我终于用海关解决了我的问题repackage-classifier。请访问docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…–
tusar

30

Gradle的答案是添加一个jar /清单/属性设置,如下所示:

apply plugin: 'java'

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

1
到目前为止最简单的答案。
lasec0203 17-10-21

29

使用IntelliJ IDEA创建jar时遇到此问题。看到这个讨论

为我解决的是重新创建jar工件,选择“ JAR”>“来自具有依赖性的模块”,但不接受META-INF / MANIFEST.MF的默认目录。将其从-/ src / main / java更改为-/ src / main / resources。

否则,它将在jar中包含清单文件,但不应该在-/ src / main / java中包含清单文件。


这对我来说适用于IDEA 14.1.6。我还为pom.xml添加了build属性,但是没有任何效果。但是你的答案解决了,谢谢。
lsrom

3
感谢您为我的桌面节省了不受其他任何工作方式的纯粹挫败感所困扰;)您的链接似乎断开了,但是我可以确认这是完美的。测试过的IntelliJ IDEA 2018年2月5日(社区版)
马蒂亚斯博

确认即使我没有/ resources目录也可以正常工作
lxknvlk19年

28

对于maven,这就是解决问题的方法(对我来说,对于GitHub上的Veetle代码库):

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

干杯...


我发现这可行,但是我不得不执行,因为mvn package shade:shade运行mvn package并没有触发阴影插件运行。
雷暴

24

尝试以下命令以包含jar:

java -cp yourJarName.jar your.package..your.MainClass

1
一种方法是在pom.xml中包含主类并使用java -jar命令,另一种方法是使用java -cp命令。
加拉夫·卡雷

15

对我而言,所有答案都无济于事-我将清单文件放在正确的位置,其中包含Main-Class和所有内容。令我震惊的是:

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

来源)。在清单的末尾添加换行符将其修复。


11

如果使用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>

3
谁说这是一个Spring Boot项目?
james.garriss

2
@ james.garriss好吧,我会说,我是来这篇文章中寻找no main manifest attribute错误的,但是我正在从事Spring Boot应用程序的工作,因此此答案对我有所帮助。我已经知道如何创建META-INF/MANIFEST.MF文件,但是不知道如何使spring-boot自动处理它。
Vishrant

5
我没有任何理由拒绝这个答案。如果您不使用spring-boot,请忽略它。Stackoverflow还有助于构建自己的问题存储库,在编程时会遇到该问题。
Vishrant

@Vishrant我对其他人一无所知,但我投票否决了,因为此答案并未解决所提出的问题。可能刚巧回答了您的问题,但您的问题并不是真正的问题。
班恩(Bane)

@贝恩确定。但是这个问题可以从广义上讲,这个答案也适用于这个问题,并且可以在其他人使用弹簧靴的意义上提供帮助。
Vishrant

10

我今天有同样的问题。解决了我的问题,将META-INF移到资源文件夹。


这也对我有用。如果您使用的是Jetbrains IntelliJ,请尝试一下
-NickSoft,

谢谢,真的为我工作:)
Syed Mehtab Hassan,

这对intellij也对我有用。谢谢你,兄弟。
Waqas

10

我刚才遇到了同样的错误。如果您正在使用gradle,只需在ur中添加下一个gradle.build

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}

com.company.project.MainClass路径UR与类public static void main(String[] args)方法。


这对我有帮助!gradle教程已指定使用顶级mainClassName变量集,但这仅对gradle run命令
有所

8

主要的问题是,当您使用工件时,它试图从依赖关系的第一个库中包含第一个MANIFEST.MF文件,而不是我们自己的MANIFEST.MF文件

  1. 将yourjar.jar重命名为yourjar.zip
  2. 从META-INF \ MANIFEST.MF中打开MANIFEST.MF文件
  3. 通过MAVEN复制已经在您的项目中生成的真实MANIFEST.MF,其中包括:

    清单版本:1.0主类:yourpacket.your主类(例如info.data.MainClass的示例)

  4. 用youjar.zip替换MANIFEST.MF的内容。

  5. 将yourjar.zip重命名为yourjar.jar。
  6. 现在,java -jar yourjar.jar可以正常工作。

要么!

简单创建您自己的MANIFEST.MF即可:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestFile> Your path like: src/main/resources/META-INF/MANIFEST.MF </manifestFile>
            <index>true</index>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
        </archive>
    </configuration>
</plugin>

但是,如果使用maven面板(或maven命令行),则可以强制其生成自己的清单并将其包含在JAR文件中。

  1. 将以下代码添加到pom.xml的build部分:

    <plugins>
        <plugin>
    
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
    
            <archive>
    
                <index>true</index>
    
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass> yourpacket.yourmainclass (for exmaple info.data.MainClass)</mainClass>
                </manifest>
                <manifestEntries>
                    <mode>development</mode>
                    <url>${project.url}</url>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>

  2. 打开MAVEN面板(在Intellij中)并执行“安装”。它将生成MANIFEST文件,并将具有所有依赖项的JAR文件的属性编译到“ Target”文件夹中。而且它将被安装到本地Maven存储库。



5

我遇到了同样的问题,现在已修复:)只需按照以下步骤进行操作,该错误可能就是任何事情,但是以下步骤使过程更加顺畅。我花了很多时间来找到解决方法。

1.尝试重新启动Eclipse(如果使用Eclipse来构建JAR文件)->实际上,这有助于我正确导出JAR文件的问题。

2,重启eclipse后,尝试看看你的eclipse是否能够通过Java项目识别出主类/方法->右键单击->运行方式->运行配置-> Main->单击搜索按钮看看您的日食是否能够在JAR文件中查找您的主类。->这是为了验证JAR文件将具有主类的入口点。

  1. 之后,将Java动态项目导出为“可运行的JAR”文件,而不是JAR文件。

  2. 在Java启动配置中,选择您的主类。

  3. 导出jar文件后,请使用以下命令执行。java -cp [您的JAR] .jar [完整包] .MainClass例如:java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. 您可能会遇到不受支持的Java版本错误。解决方法是更改​​shell bash配置文件中的java_home,使其与用于在Eclipse中编译项目的Java版本相匹配。

希望这可以帮助!请告诉我您是否还有任何问题。


5

我有同样的问题。这里提到的许多解决方案并没有给我完整的画面,因此我将尝试向您简要介绍如何从命令行打包jar文件

  1. 如果要将.class文件放在包中,请在的开头添加包.java

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. 要使用.class文件名以包名给出的结构结尾的文件来编译代码,请使用:

    javac -d . Test.java

    -d .使编译器创建所需的目录结构。

  3. 打包.jar文件时,需要指导jar例程如何打包。在这里,我们使用选项集cvfeP。这是为了保持包结构(选项P),指定入口点,以便清单文件包含有意义的信息(选项e)。Option f使您可以指定文件名,Option c创建档案,并且Option v将输出设置为详细。这里要注意的重要事项是Pe

    然后是我们想要的罐子的名字test.jar

    然后是进入点。

    然后-C . <packagename>/从该文件夹中获取类文件,并保留文件夹结构。

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. .jar在zip程序中检查文件。它应该具有以下结构

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class

    MANIFEST.MF应包含以下内容

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test

    如果您手动编辑清单,请确保将换行符保留在末尾,否则java无法识别它。

  5. 使用执行.jar文件

    java -jar test.jar

1
您的答案的第四步非常重要!由于清单末尾的换行符,我的清单无法正常工作,我不知道自己必须输入。我就该主题访问过的所有答案(很多)都没有提到这一点,对于不使用maven,ant,gradle等的人来说,这是强制性的。
Maude

1
@Maude感谢您的反馈。这就是为什么我在粗体字中添加了带有换行符提示的答案的原因。我花了好几天才找到与自动生成的清单进行比较的结果。
CodeMonkey

哈哈,谢谢。我只是在想那个换行符。
理查德·托马斯

5

我个人认为这里的所有答案都是对这个问题的误解。答案在于spring-boot如何构建.jar。大家都知道,春季引导建立一个清单这样,从每个人的变化asssumption,这是一个标准的.jar推出,这可能是也可能不是:

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

也许需要org.springframework.boot.loader.JarLauncher在类路径上执行?


这听起来很有希望。您到底如何将JarLauncher添加到类路径?
MarkHu '18

4

任何可执行的jar文件都应通过单击来运行,或通过使用命令提示符运行,如java -jar app.jar(使用“如果jar的路径包含空格”,即java -jar“ C:\ folder name \ app.jar”)运行。如果您的可执行jar未运行,则表示它创建不正确。

为了更好地理解,请解压缩jar文件(或使用Windows 7-Zip的任何工具进行查看),然后在/META-INF/MANIFEST.MF下检查该文件。如果您发现任何类似的条目

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

请注意在MANIFEST.MF文件上附加Main-Class条目,请检查保存位置!


4

您可以简单地按照以下步骤使用创建一个jar文件

 jar -cfm jarfile-name manifest-filename Class-file name

在运行jar文件时,像这样简单运行

 java -cp jarfile-name main-classname

4

您可能没有正确创建jar文件:

例如:jar创建中缺少选项m

以下作品:

jar -cvfm MyJar.jar Manifest.txt *.class

4

如果使用命令行汇编.jar,则可以指向主目录而无需添加Manifest文件。例:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(参数“ e”这样做:TheNameOfClassWithMainMethod是使用方法main()和app.jar-可执行.jar和* .class的名称的类的名称-只是要汇编的所有类文件)


3

对我来说,发生此错误仅仅是因为我忘记告诉Eclipse我想要一个可运行的jar文件,而不是一个简单的库jar文件。因此,当您在Eclipse中创建jar文件时,请确保单击正确的单选按钮


3

以上答案仅对我有部分帮助。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包含要运行的主类。我不确定100%是否总能假设您需要的课程是第一堂课,但这是对我来说。如果不是这样,我想可以使用grep排除与库相关的结果以将类列表缩减到可管理的大小并不难。

从那里开始很容易:我只使用该路径(减去“ .class”后缀):

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

它并不总是一流的。几乎没有。命令行应该是java -cp ... somepackage.App
user207421'3

2

既然您已经添加了MANIFEST.MF,我认为您应该考虑此文件中字段的顺序。我的环境是 java version "1.8.0_91"

还有我的MANIFEST.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

??订单无关紧要。不清楚您的要求。
user207421'3

2

(第一篇文章-因此可能不干净)

这是我针对OS X 11.6(基于Maven的Netbeans 8.2程序)的修复程序。到目前为止,我的应用程序是100%Netbeans-无需进行任何调整(对于可能的情况,仅需进行一些脱壳操作即可!)。

在这里和其他地方都尝试了大多数答案后,我无济于事,我回到了“运用有效的方法”的艺术。

此处的最佳答案(olivier-refalo thanx)似乎是正确的起点,但没有帮助。

在查看其他有效的项目后,我发现清单行中存在一些细微差异:

  1. addClasspath,classpathPrefix不存在(将其删除)
  2. mainClass缺少“ com”。(使用NB->项目属性->运行->主类->浏览指定)

不知道为什么(我才进入Java仅3个月)还是如何,但是只能说这有效。

这只是使用的修改的清单块:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>

2

我找到了解决不良清单的新方法!

  1. 使用zip编辑器(如WinRAR)打开jar文件
  2. 点击获取META-INF

  3. 添加或编辑

    • 加:

      • 在名为META-INF的文件夹中创建一个名为MANIFEST.MF的文本文件,并添加以下行:

        • 清单版本:1.0
        • 主要类别:package.ex.com.views.mainClassName
      • 保存文件并将其添加到zip文件中

    • 编辑:

      • 拖出文件,修改MANIFEST.MF以添加上一行
  4. 打开cmd并输入:java -jar c:/path/JarName.jar

现在应该可以正常工作了!


2

大多数解决方案都不适合我,但是我的老师帮助了我,我想在这里分享他的解决方案。

javac *.java
nano MANIFEST.MF

在文件类型中

Main-Class:Main或您的主文件名(请确保添加软件包名称(如果存在))

jar -cvmf MANIFEST.MF new.jar *.class

现在运行文件使用

java -jar new.jar

或者你可以去文件属性检查

允许将文件作为程序执行

双击它

它对我有帮助,而上述大多数答案都没有


1

您可能遇到与我相同的问题。创建.jar文件后,编写jar xf app.jar META-INF/MANIFEST.MF。这将在当前目录中创建文件的副本,以便您可以读取它。如果仅显示类似以下内容:

清单版本:1.0

创建者:1.8.0_51(Oracle公司)

并且不包含“ Main-Class”声明,那么我认为您找到了问题。

不过,我不知道如何解决。我在StackOverflow上检查了其他具有相同/相似问题的人,但找不到答案。但是,有了这些信息,您也许可以获得更好的帮助(考虑到您遇到的问题与我相同)。

编辑:我曾尝试过使用清单文件,但未能使其正常工作,但我的错误是在创建jar文件时仅命名了其中一个类。我写了* .class,它现在可以工作了。

尽管我不知道为什么需要创建清单文件。但是我想只要能工作就可以了。


1

我遇到了这个问题,最近我通过在Netbeans 8中执行此操作解决了此问题(请参见下图):

Netbeans项目属性

  1. 转到项目的属性
  2. 点击运行
  3. 使用browser指定项目的主类。
  4. 生成运行 Jar文件。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.