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

我已经安装了一个应用程序,当我尝试运行它(这是一个可执行的jar)没有任何反应。 当我从命令行运行它:

java -jar“app.jar”

我收到以下消息:

没有主要的清单属性,在“app.jar”

通常,如果我自己创build了这个程序,我会在清单文件中添加一个主类属性。 但在这种情况下,由于该文件来自一个应用程序,我不能这样做。 我也尝试提取jar来看看我能不能find主类,但是有很多类,没有一个在名字中有“main”这个词。 必须有办法解决这个问题,因为程序在其他系统上运行良好。

首先,这看起来很奇怪,看到你运行java -jar "app"而不是java -jar app.jar

其次,要创build一个jar可执行文件…你需要打开一个名为META-INF / MANIFEST.MF的文件

文件本身应该有(至less)这一个class轮:

 Main-Class: com.mypackage.MyClass 

其中com.mypackage.MyClass是持有public static void main(String [] args)入口点的类。

请注意,有几种方法可以通过CLI,Maven或Ant来完成:

对于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.0.2</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.mypackage.MyClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> 

(select一个适合你的项目的<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 –

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

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

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

 java -cp app.jar com.somepackage.SomeClass 

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

或者,您可以使用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文件名replace。

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

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

 Main-Class: <packagename>.<classname> 

如果MANIFEST.MF文件中缺less此行,则会出现此“无主清单属性”错误。

在MANIFEST.MF文件中指定这个属性确实是一个巨大的麻烦。

更新:我刚刚find一个非常简洁的方式来指定在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. 

在这里输入图像描述

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

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

对于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> 

干杯…

试试这个命令来包含jar:

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

对我来说,没有任何答案真的有帮助 – 我在正确的地方有清单文件,包含主要类和一切。 什么绊倒我是这样的:

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

( 来源 )。 在清单末尾添加一个换行符修复了它。

使用IntelliJ IDEA创buildjar时遇到了这个问题。 看到这个讨论 。

解决这个问题的方法是重新创buildjar工件,selectJAR>从依赖关系模块,但不接受默认的META-INF / MANIFEST.MF目录。 将其从 – / src / main / java更改为 – / src / main / resources。

否则,它会在jar中包含一个清单文件,但不包括它在 – / src / main / java中的清单文件。

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

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

我面临同样的问题,现在是固定的:)只要按照下面的步骤,错误可能是任何东西,但下面的步骤使过程更顺利。 我花了很多时间来find修复。

1.尝试重新启动Eclipse(如果您使用Eclipse来构buildJAR文件) – >实际上,这有助于正确导出JAR文件。

2.重启Eclipse之后,试着看看你的eclipse是否能够通过你的Java项目识别主类/方法 – >右键 – >运行 – >运行configuration – > Main – >点击Searchbutton看看你的eclipse是否能够在JAR文件中查找你的主类。 – >这是为了validationJAR文件将具有到主类的入口点。

  1. 之后,将您的Java Dynamic项目导出为“Runnable JAR”文件而不是JAR文件。

  2. 在Java启动configuration中,select你的主类。

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

  4. 您可能会遇到不受支持的Java版本错误。 修复的方法是在你的shell bashconfiguration文件中更改java_home以匹配用于在eclipse中编译项目的java版本。

希望这可以帮助! 请让我知道,如果你仍然有任何问题。

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

为了更好地理解,提取jar文件(或使用任何工具查看,对于Windows 7-Zip是不错的),并检查/META-INF/MANIFEST.MF文件。 如果你发现任何类似的条目

主要类:your.package.name.ClaaswithMain – 那么很好,否则你必须提供它。

请注意在MANIFEST.MF文件中添加Main-Class条目,请检查您保存的位置!

您可能没有正确创buildjar文件:

例如:在jar创build中缺less选项m

以下工作:

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

对我来说,这个错误发生,因为我忘了告诉Eclipse,我想要一个可运行的jar文件,而不是一个简单的库jar文件。 所以当你在Eclipse中创buildjar文件时,请确保你单击了右边的单选button

你可以简单地按照这个步骤使用创build一个jar文件

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

运行jar文件时就像这样简单运行

  java -cp jarfile-name main-classname 

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

第1步:find我需要运行的类

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

结果的第一行是:

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

App.class包含要运行的主类。 如果你总能假设你需要的课程是第一个课程,我不是100%确定的,但是对我来说。 如果不是,我想可以使用grep来排除与库相关的结果,从而将类列表减less到可pipe理的大小。

从那里很容易:我只是使用该path(减去“.class”后缀):

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

我有同样的问题。 这里提到的很多解决scheme并没有给我全面的介绍,所以我会试着给你一个如何从命令行打包jar文件的总结。

  1. 如果你想在包中包含你的.class文件,在.java的开头添加这个包。

    Test.java

     package testpackage; public class Test { ... } 
  2. 要用你的.class文件编译你的代码,这个文件的结尾是由包名给出的结构,使用:

     javac -d . Test.java 

    -d . 使编译器创build你想要的目录结构。

  3. 打包.jar文件时,需要指示jar例程如何打包。 这里我们使用选项设置cvfeP 。 这是为了保留包结构 (选项P ), 指定入口点,以便清单文件包含有意义的信息(选项e )。 选项f可让您指定文件名,选项c创build一个档案,选项v将输出设置为冗长。 这里要注意的是Pe

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

    然后来到入口点。

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

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

    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 

既然你已经添加了MANIFEST.MF,我想你应该考虑在这个文件中的字段顺序。 我的env是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 

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

(第一个post – 所以它可能不是干净的)

这是我对基于Maven的Netbeans 8.2程序OS X 11.6的修复。 到目前为止,我的应用程序是100%的Netbeans – 没有调整(只是几个shell逃脱的不可能的!)。

我在这里和其他地方尝试了大部分的答案都无济于事,于是我回到了“运用什么”的艺术上。

这里最好的答案( 奥利维尔 – 比利时 )看起来是正确的地方,但没有帮助。

看看其他有用的项目,我注意到清单行中的一些细微差别:

  1. addClasspath,classpathPrefix不存在(删除它们)
  2. mainClass错过了“com”。 (使用NB – >项目属性 – >运行 – >主类 – >浏览来指定)

不知道为什么(我只有3个月成java)或如何,但只能说这工作。

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

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

我刚刚得到同样的错误。 如果你使用gradle ,只需在你的gradle添加下一个:

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

其中com.company.project.MainClass类的path使用public static void main(String[] args)方法。

你可能会遇到和我一样的问题。 在创build.jar文件之后,编写jar xf app.jar META-INF/MANIFEST.MF 。 这将创build一个文件的副本到您的当前目录,以便您可以阅读它。 如果它只是说:

Manifest-Version:1.0

创build者:1.8.0_51(甲骨文公司)

并没有包含“Main-Class”声明,那么我认为你发现了你的问题。

不过,我不知道如何解决这个问题。 我检查了与StackOverflow相同/相似问题的其他人,无法find答案。 然而,有了这些信息,你可能会得到一些更好的帮助(因为你有和我一样的问题)。

编辑:我已经尝试了一个清单文件,但没有得到它的工作,但我的错误是只创build一个类名时创buildjar文件。 我写* .class而不是现在它的作品。

虽然我不知道为什么需要创build清单文件。 但是我认为只要它有效就没问题。

检查你的本地.m2目录中的这个工件的子目录。 如果exixts – 删除它,并再次执行Maven更新

如果您使用命令行组装.jar,则可以在不添加清单文件的情况下指向主。 例:

 jar cfve app.jar TheNameOfClassWithMainMethod *.class 

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

检查你的jar文件里面的MANIFEST.MF主要类是否可用

first.java

 class first { public static void main (String arg[ ]) { System.out.println("Welcome to the world of Java"); } } 

之前

 Manifest-Version: 1.0 Created-By: 1.7.0_80 (Oracle Corporation) sony@sony-VPCEH25EN:~/Documents$ java -jar first.jar no main manifest attribute, in first.jar 

后:

 Manifest-Version: 1.0 Created-By: 1.7.0_80 (Oracle Corporation) Main-Class: first sony@sony-VPCEH25EN:~/Documents$ java -jar first.jar Welcome to the world of Java 

我有一个类似的问题,在下面的语法来成功创build.war文件: –

jar {cvf} [jar文件] [manifest-file]

清单在创build(c)或更新(u)JAR文件时,清单操作数定义了预先存在的清单文件,其中包含JAR文件中MANIFEST.MF中包含的属性的名称和值。 如果f选项存在“[ 1 ]”,则必须指定清单操作数。

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

jar -cvf foo.war *

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

我有这个问题,最近我在Netbeans 8中解决了这个问题(参考下图):

Netbeans项目属性

  1. 去你的项目的属性
  2. 点击运行
  3. 使用浏览指定项目的主要类。
  4. 构build运行 Jar文件。

只是为了清楚一点

 Main-Class: <packagename>.<classname> 

如果你没有包,你必须忽略这个部分,像这样:

 Main-Class: <classname> 

我个人认为这里的所有答案都是误解了这个问题。 答案就在于spring-boot如何构build.jar。 每个人都知道Spring Boot设置了一个这样的清单,这个清单不同于所有人都认为这是一个标准的.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 

也许它需要在类path上使用org.springframework.boot.loader.JarLauncher来执行?