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

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

java-jar"app.jar"

我收到以下消息:

没有主清单属性,在"app.jar"

通常情况下,如果我自己创建了这个程序,我会在清单文件中添加一个main class属性。但在这种情况下,由于该文件来自应用程序,我不能这样做。我还尝试解压jar以查看是否能找到main class,但是有很多类,但其中没有一个类的名称中包含“main”一词。一定有办法解决这个问题,因为该程序在其他系统上运行正常。

2128765 次浏览

如果jar没有跟随的规则,它就不是一个可执行的jar。

这应该是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是包含运行程序的main方法的类。(该类是什么取决于程序,从您提供的信息中无法判断)。

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

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

文件本身应该(至少)有这样一个行:

Main-Class: com.mypackage.MyClass

其中com.mypackage.MyClass是持有公共静态无效主(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

此插件的最新文档:参见https://maven.apache.org/plugins/maven-jar-plugin/

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

(选择适合您项目的#0

对于蚂蚁,下面的代码片段应该有帮助:

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

迈克尔·尼曼德

对于Gradle

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

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

为了更好地理解,提取jar文件(或使用任何工具查看,对于Windows 7-Zip是不错的)并检查 /META-INF/MANIFEST.MF.下的文件

主类:your.package.name.Claaswith Main-然后就可以了,否则你必须提供它。

注意在MANIFEST.MF文件上附加主类条目,检查您保存的位置!

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

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

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

以下作品:

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

您可以简单地按照此步骤操作使用

创建jar文件
 jar -cfm jarfile-name manifest-filename Class-file name

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

 java -cp jarfile-name main-classname

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

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

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.

输入图片描述

或者,您可以使用maven-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应该按字面意思放置为,而不是替换为您想要包含的jar文件名。

对我来说,没有一个答案真正有帮助——我把清单文件放在正确的位置,包含主类和所有内容。让我绊倒的是:

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

来源)。在清单末尾添加换行符可以修复它。

您可能会遇到与我相同的问题。创建您的. jar文件后,写入jar xf app.jar META-INF/MANIFEST.MF。这将在您的当前目录中创建文件的副本,以便您可以读取它。如果它只说:

清单版本:1.0

创建者:1.8.0_51(Oracle Corporation)

并且不包含“主类”声明,那么我想你找到了你的问题。

不过,我不知道如何解决它。我在StackOverflow上检查了其他有相同/类似问题的人,找不到答案。然而,有了这些信息,你也许可以得到一些更好的帮助(考虑到你和我有同样的问题)。

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

虽然我不知道为什么需要创建清单文件。但我想只要它能工作就行了。

对我来说,发生这个错误只是因为我忘记告诉Eclipse我想要一个可运行的jar文件,而不是一个简单的库jar文件

我遇到了同样的问题,现在已经修复了:)只要按照以下步骤操作,错误可能是任何东西,但以下步骤使过程更顺畅。我花了很多时间来找到修复方法。

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

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

  1. 在此之后,将Java动态项目导出为“Runnable JAR”文件而不是JAR文件。

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

  3. 导出jar文件后,使用以下命令执行。java-cp[您的JAR]. jar[完整的包]。MainClassjava-cpAppleTCRuleAudit.jarcom.apple.tcruleaudit.classes.TCRule审计

  4. 你可能会面对不支持的java版本错误。修复是更改shell bash配置文件中的java_home以匹配用于在eclipse中编译项目的java版本。

希望这有帮助!如果您还有任何问题,请告诉我。

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

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

检查您的本地. m2目录以查找此工件的子目录。如果exixts-删除它,并再次执行Maven更新

我在使用IntelliJ IDEA创建jar时遇到了这个问题。请参阅这次讨论

对我来说,解决这个问题的方法是重新创建jar工件,选择JAR>from具有依赖项的模块,但不接受META-INF/MANIFEST.MF.的默认目录将其从-/src/main/java更改为-/src/main/资源。

否则,它会在jar中包含一个清单文件,而不是它应该在-/src/main/java中包含的文件。

如果您使用命令行组装. jar,则可以指向主文件而无需添加清单文件。示例:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(参数"e"做到了这一点:TheNameOfClassWith MainWay是方法main()的类的名称,app.jar-可执行文件的名称. jar和*. class-只是要组装的所有类文件)

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

检查您的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.0Created-By: 1.7.0_80 (Oracle Corporation)
sony@sony-VPCEH25EN:~/Documents$ java -jar first.jarno main manifest attribute, in first.jar

之后:

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

我也遇到过类似的问题,在下面的语法中成功创建. war文件:-

jar{cvf}[jar文件][清单文件]

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

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

jar-cvffoo.war*

老实说,我不知道这是否是一种最佳做法,但它对我来说是有效的:)。

我也遇到了同样的问题。这里提到的许多解决方案并没有给我提供全貌,所以我将尝试为您总结如何从命令行打包jar文件

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

    Test.java

    package testpackage;
    public class Test{...}
  2. To compile your code with your .class files ending up with the structure given by the package name use:

    javac -d . Test.java

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

  3. 打包.jar文件时,您需要指示jar例程如何打包它。这里我们使用选项集cvfeP。这是保持封装结构(选项P),cvfeP0以便清单文件包含有意义的信息(选项e)。选项f允许您指定文件名,选项c创建存档,选项v将输出设置为详细。这里要注意的重要事项是Pe

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

    然后是切入点。

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

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. Check your .jar file in a zip program. It should have the following structure

    test.jar

    META-INF| MANIFEST.MFtestpackage| Test.class

    MANIFEST.MF应包含以下内容

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

    如果您手动编辑清单一定要把换行符放在最后,否则Java无法识别它。

  5. 执行您的.jar文件

    java -jar test.jar

我遇到了这个问题,我最近在NetBeans 8中解决了这个问题(请参阅下图):

NetBeans项目属性

  1. 转到您的项目的属性
  2. 点击运行
  3. 使用浏览指定项目的主类。
  4. 建立运行 Jar文件。

既然您添加了MANIFEST.MF,我认为您应该考虑此文件中Field的顺序。

我的MANIFEST.MF这里

// MANIFEST.MFManifest-Version: 1.0Created-By: 1.8.0_91 (Oracle Corporation)Main-Class: HelloWorldSwing
// run~ java -jar HelloWorldSwing.jarno main manifest attribute, in HelloWorldSwing.jar

然而,这如下贯穿

Manifest-Version: 1.0Main-Class: HelloWorldSwingCreated-By: 1.8.0_91 (Oracle Corporation)
//this run swing normally

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

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

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

结果的顶线是:

META-INF/META-INF/MANIFEST.MFsomepath/somepath/App.classMETA-INF/maven/...

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

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

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

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

(第一篇文章-所以它可能不干净)

这是我对OS X 11.6、基于Maven的NetBeans 8.2程序的修复。到目前为止,我的应用程序是100%NetBeans-没有调整(只是一些不可能的shell逃逸!)。

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

这里的最高答案(olivier-refalo THANX)看起来像是正确的开始,但没有帮助。

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

  1. addClasspath, classpath前缀缺席(删除它们)
  2. main Class缺少“com”(使用NB->Project)属性->运行->主类->浏览指定)

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

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

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

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

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

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

只是想弄清楚一点

Main-Class: <packagename>.<classname>

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

Main-Class: <classname>

我个人认为这里所有的答案都误解了这个问题。这个问题的答案在于sping-boot如何构建. jar的不同。每个人都知道Spring Boot设置了一个这样的清单,这与每个人假设不同,这是一个标准的. jar启动,它可能是也可能不是:

Start-Class: com.myco.eventlogging.MyServiceSpring-Boot-Classes: BOOT-INF/classes/Spring-Boot-Lib: BOOT-INF/lib/Spring-Boot-Version: 1.4.0.RELEASECreated-By: Apache Maven 3.3.9Build-Jdk: 1.8.0_131Main-Class: org.springframework.boot.loader.JarLauncher

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

我找到了一个新的解决方案坏清单生成!

  1. 使用WinRAR等zip编辑器打开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

它现在应该工作得很好!

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

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

找到了一个很好的解决方案,可以在任何此类情况下提供帮助,因为您只需要一个可运行的罐子,您在大多数情况下都会这样做。如果您的应用程序在Intellij Idea中运行,请按照以下步骤操作:1)转到模块设置,然后是工件,并添加一个jar并定义主类2)然后去构建在菜单中,点击“构建工件”,你会得到罐子。

即使我更改了源文件夹并使用scala而不是java,这也有效。

大多数的解决方案都不适合我,但我的导师帮助了我我想在这里分享他的解决方案我使用kali linux终端,但在所有debian中都应该没问题

javac *.javanano MANIFEST.MF

在文件类型

主类:主或者无论您的主文件名是什么(如果存在,请确保添加包名称)

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

现在运行文件使用

java -jar new.jar

或者你可以去档案和检查

允许文件作为程序执行

双击它

它帮助了我,而上面的大多数答案都没有

MAVEN的问题是,它尝试包含来自依赖项的第一个库的第一个MANIFEST.MF文件,而不是我们自己的MANIFEST.MF当你使用人造物品!

  1. 重命名yourjar.jaryourjar.zip
  2. 从META-INF打开MANIFEST.MF文件\MANIFEST.MF
  3. 复制MAVEN已经在项目中生成的实际MANIFEST.MF其中包括:

    清单版本:1.0yourpacket.yourmainclass(例如info.data.MainClass)

  4. 替换youjar.zipMANIFEST.MF的内容。

  5. 重命名yourjar.zipyourjar.jar。
  6. 现在java-jaryourjar.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的构建部分:

    <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中)并执行“Install”。它将生成MANIFEST文件并将具有所有依赖项的JAR文件编译到“Target”文件夹中。它也将安装到本地maven存储库。

我在执行mvn包时遇到了同样的错误。这就是我解决问题的方式。

我正在使用maven多模块。我面临这个问题,因为我错误地添加了下面的父pom部分。

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

然后在子模块中添加这个之后pom.xml并从父pom中删除解决了我的问题。

我试过了,它对我有用。mvn清洁安装包应该可以工作。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

使用以下内容创建文件夹META-INF和该文件夹中的文件MANIFEST.MF

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

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

只需将其添加到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测试了这个。

对于我来说,问题是<build>下的<pluginManagement>使事情无法正常工作。

我原来的pom.xml:

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

删除<pluginManagement>后,错误消失了。

如果你的maven和pom.xml是这样的

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><properties><java.version>11</java.version></properties><dependencies><!-- dependencies --></dependencies><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></pluginManagement></build></project>

只需注释pluginManagement,将导致您获得以下pom.xml

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><properties><java.version>11</java.version></properties><dependencies><!-- dependencies --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

在我的案例中-我在一个多模块项目中工作-我可以通过以下方式介绍这个问题:

我将此添加到父pom.xml中,这导致了问题。即,值为trueskip

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--besides hindering the packaging, this also skips running the app after build when calling spring-boot:run. You have to enable it in thecorresponding module by setting skip to false, there.--><skip>true</skip></configuration></plugin></plugins></build>

我通过向我想要打包为jar的模块添加相同的配置来修复这个问题,但将skip的值更改为false

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>${project.mainClass}</mainClass><layout>ZIP</layout><skip>false</skip></configuration><executions><execution><goals><goal>repackage</goal></goals></execution><execution><id>build-info</id><goals><goal>build-info</goal></goals></execution></executions></plugin>

您可以简单地将其添加到属性标签中。当您有多个子模块时,也可以这样做,为每个子模块添加它pom.xml

这是我的pom.xml,

<properties><java.version>11</java.version><startclass>com.sample.MyApplication</start-class></properties>