Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法执行jar文件:“无主清单属性”_Java_Jar_Manifest_Main - Fatal编程技术网

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

Java 无法执行jar文件:“无主清单属性”,java,jar,manifest,main,Java,Jar,Manifest,Main,我已经安装了一个应用程序,当我试图运行它时,它是一个可执行的jar,什么都没有发生。当我使用以下命令行运行它时: java-jarapp.jar 我得到以下信息: app.jar中没有主清单属性 通常,如果我自己创建了这个程序,我会在清单文件中添加一个主类属性。但在本例中,由于文件来自应用程序,因此我不能这样做。我还尝试提取jar,看看是否可以找到main类,但是有太多的类,它们的名称中都没有main这个词。必须有办法解决这个问题,因为程序在其他系统上运行良好。如果jar没有跟随,它就不是可执行

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

java-jarapp.jar

我得到以下信息:

app.jar中没有主清单属性


通常,如果我自己创建了这个程序,我会在清单文件中添加一个主类属性。但在本例中,由于文件来自应用程序,因此我不能这样做。我还尝试提取jar,看看是否可以找到main类,但是有太多的类,它们的名称中都没有main这个词。必须有办法解决这个问题,因为程序在其他系统上运行良好。

如果jar没有跟随,它就不是可执行jar。

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

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

如果它不是一个可执行的JAR,那么您需要使用以下内容运行程序:

java -cp app.jar com.somepackage.SomeClass

其中com.somepackage.SomeClass是包含运行程序的主方法的类。这个类是什么取决于程序,无法从您提供的信息中分辨出来。

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

第二,要使jar可执行。。。您需要jar一个名为META-INF/MANIFEST.MF的文件

文件本身应至少有一行:

Main-Class: com.mypackage.MyClass
其中com.mypackage.MyClass是包含公共静态void mainString[]args入口点的类

请注意,有几种方法可以通过CLI、Maven、Ant或Gradle实现这一点:

对于CLI,可以使用以下命令:tks@


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

为了更好地理解,请使用任何工具提取jar文件或视图,因为windows 7-Zip是一个不错的工具,并检查/META-INF/MANIFEST.MF下的文件。如果你发现任何类似的条目

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


注意在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-Class: <packagename>.<classname>
apply plugin: 'java'

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

或者,您可以使用maven assembly插件,如下例所示:

<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文件名替换。

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

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


。在清单末尾添加一个新行修复了它。

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

我遇到了相同的问题,现在已经解决了: 只需按照以下步骤操作,错误可能是针对任何情况的,但以下步骤会使过程更加顺利。我花了很多时间来找到解决办法

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

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

在此之后,将Java动态项目导出为可运行的JAR文件,而不是JAR文件

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

导出jar文件后,使用下面的命令执行。 java-cp[Your JAR].JAR[complete package].MainClass 例如:java-cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.tcruleaudit

您可能会遇到不支持的java版本错误。修复方法是更改shell bash概要文件中的java_home,以匹配用于在eclipse中编译项目的java版本


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

梯度答案是添加一个jar/manifest/attributes设置,如下所示:

Main-Class: <packagename>.<classname>
apply plugin: 'java'

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

我在使用IntelliJ IDEA创建jar时遇到了这个问题。看

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


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

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

param e会这样做:NameOfClassWithMain方法是一个类的名称,它的方法是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文件

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

Test.java

要使用.class文件编译代码,并以包名给定的结构结束,请使用:

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

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

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

然后是入口点

然后是-C要从该文件夹中获取类文件,请保留文件夹结构

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

test.jar

MANIFEST.MF应包含以下内容

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

既然你添加了.M.MF,我想你应该考虑这个文件中的字段顺序。我的环境是java版本1.8.091

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

上述答案对我只有部分帮助。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

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

第一个贴子-因此它可能不干净

这是我对OSX11.6的修复,基于Maven的NetBeans8.2程序。到目前为止,我的应用程序是100%的Netbeans-不需要调整,只需要一些shell转义就可以了

在尝试了这里和其他地方的大部分答案后,都没有任何结果,我回到了使用有用的东西的艺术

这里的首要答案是thanx看起来是一个正确的起点,但没有帮助

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

addClasspath、classpathPrefix不存在删除它们 mainClass缺少com。使用NB->Project 属性->运行->主类->浏览以指定 我不知道为什么我只学了3个月的java或者怎么学的,但我只能说这是有效的

以下是所使用的修改清单块:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>
我刚才也犯了同样的错误。 如果您正在使用gradle,只需在您的gradle.build中添加下一个:


其中com.company.project.MainClass使用公共静态void mainString[]args方法指向ur类的路径。

只是为了澄清一点

Main-Class: <packagename>.<classname>
如果您没有软件包,则必须忽略该部分,如下所示:

Main-Class: <packagename>.<classname>
apply plugin: 'java'

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

我个人认为这里所有的答案都是对这个问题的误解。答案在于 spring boot构建.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
也许它需要在类路径上使用org.springframework.boot.loader.JarLauncher来执行?

我找到了一个新的解决方案来生成错误的清单

使用类似WinRAR的zip编辑器打开jar文件 点击查看META-INF

添加或编辑

加:

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

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

编辑:

将文件拖出修改MANIFEST.MF以添加上一行 打开cmd并键入:java-jarc:/path/JarName.jar


现在应该可以用了

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

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

MAVEN的问题在于,当您使用工件时,它会尝试从依赖项的第一个库中包含第一个MANIFEST.MF文件,而不是我们自己的MANIFEST.MF

将yourjar.jar重命名为yourjar.zip 从META-INF\MANIFEST.MF打开MANIFEST.MF文件 复制MAVEN在项目中已经生成的real MANIFEST.MF 其中包括:

清单版本:1.0 主类:exmaple info.data.MainClass的yourpack.yourmainclass

用它替换youjar.zip中MANIFEST.MF的内容

将yourjar.zip重新命名为yourjar.jar。 现在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文件中

将以下代码添加到you 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>
在Intellij中打开MAVEN面板并执行安装。它将生成清单文件,并将包含所有依赖项的JAR文件编译到目标文件夹中。它还将安装到本地maven存储库中


我试过这个,它对我有效。 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>

就我的情况而言,这个问题正在恶化,使事情无法正常运转

我的原始pom.xml:

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

删除后,错误消失。

查找主要方法;你不能依赖类名。我知道,但因为我只有.class文件,所以我看不到方法。或者我可以吗?你不是真的在打引号吧?在任何情况下,都有很多方法可以查看方法,包括使用javap。不过,您可能希望取消jar并查看是否实际上没有清单。相关:与依赖项相关:如果在使用CommandLineJobRunner运行代码时没有main类该怎么办谢谢您的回答,但您的解决方案只有在我知道包含main方法的类的名称时才起作用。这是一个打字错误。。。它应该是app.jar。但是,您如何通过双击该文件来解释它为什么在其他系统上运行?如果它确实是一个可执行的JAR,您可以提取清单文件,它位于JAR文件内的META-INF目录中。它应该包含一个主类属性,该属性为您提供主类的名称。如果它不在一个系统上运行,那么该系统可能有一个太旧的Java版本。例如,如果JAR是用Java 7编译的,那么您就不能在具有Java 6或更早版本的系统上运行它。这很有趣,因为另一个系统运行的是win7,而这台有问题的电脑运行的是win8。@Jesper Hello,如果eclipse使用的是默认包呢?我只是把类名放在元素内吗?谢谢。只想添加一点,即您可以使用以下内容将依赖项复制到lib文件夹:。因为类路径包含lib文件夹,所以您只需要使用java-jar myproject.jar执行jar,它就会找到依赖项。如何jar一个名为META-INF/MANIFEST.MF的文件?我一方面有一个.jar,另一方面有一个.MF,如何将它们链接在一起?我把清单和.jar放在同一个文件夹中,但它不起作用,我还是遇到了问题@Wicelo要在创建jar文件时指定特定的MANIFEST.MF文件,请使用jar的m标志。jar cmvf META-INF/MANIFEST.MF.jar注意:对于Maven,我在VSC生成的Maven文件中已经有了一个Maven jar插件项,所以我只是在其中添加了一节。+1对于jar文件规范链接完美,这很有效。它将所有依赖项捆绑到一个jar中,从而允许您编译/构建项目并开箱即用地运行它。在的上下文中,您必须遵循的帮助。这与maven assembly插件一起工作。maven jar插件没有。注意:将此代码放在pom.xml文件中,放在这里,然后在右边的IDEA open maven滑动菜单中执行maven Package,查找project>Lifecycle>Package。然后,您的jar文件将位于目标文件夹中。干杯我真的在努力解决这个问题…这很好用。T

汉克斯!一种方法是在pom.xml中包含main类并使用java-jar命令,另一种方法是使用java-cp命令。我还为pom.xml添加了build属性,但没有效果。但是你的回答解决了这个问题,谢谢你。谢谢你让我的桌面不再因为没有其他东西工作而感到沮丧;你的链接似乎断了,但我可以确认这是完美的。使用IntelliJ IDEA 2018.2.5社区版进行测试,确认此功能有效,即使我没有/资源目录断开的链接,你是说https://stackoverflow.com/questions/20952713/wrong-manifest-mf-in-intellij-idea-created-jar?This 还是在2020年为我解决了这个问题谁说这是一个春靴项目?@james.garriss我想说,我在这篇文章中搜索的不是主清单属性错误,但我正在开发SpringBoot应用程序,所以这个答案对我很有帮助。我已经知道如何创建META-INF/MANIFEST.MF文件,但不知道如何让spring boot自动处理它。我不认为有任何理由对这个答案投反对票。如果您没有使用SpringBoot,请忽略它。Stackoverflow还可以帮助您建立自己的问题库,您在编程时会遇到这些问题。@Vishrant我不知道其他人的情况,但我投了反对票,因为这个答案并没有解决提出的问题。也许正好回答了你的问题,但你的问题并不是真正被问到的问题。@Bane,当然。但是这个问题可以从广义上理解,这个答案也适用于它,并且可以帮助其他人使用spring boot。这是迄今为止最简单的答案。对于在Kotlin上编写的Gradle构建脚本,请参见。我发现这是可行的,但我必须作为mvn包shade执行:shade只是运行mvn包并没有触发shade插件快跑,这帮了我的忙!gradle教程已经指定使用顶级mainClassName变量集,但这只对gradle运行命令有帮助,对创建可执行文件没有帮助。这听起来很有希望。如何将JarLauncher添加到类路径中?它并不总是第一个类。几乎没有命令行应该是java-cp。。。somepackage.App.Eh?命令无关紧要。不清楚你在索取什么。工作完美,但是考虑到2018年4月Or.Spring FraskWork.BooSpring Spring Maven插件2.0.1版本的版本。抱歉,这不是一个解决方案,因为他不是在谈论Spring Bug,这是JAR执行的一般问题:非常感谢。这解决了弹簧靴的问题!我正在研究SpringBoot2.2.0.Release。不幸的是,这个解决方案对我不起作用。然而,当你从一个。。。pom.xml中的应用程序。我的猜测是,如果我们访问父应用程序的pom.xml,我们会有一个清晰的想法。我最终用自定义重新打包分类器解决了我的问题。请访问这里有什么问题吗,我要投票了?!回答的第四步非常重要!我的舱单不起作用,因为最后的那条新线我不知道我必须放进去。我经常访问的关于这个主题的所有答案都没有提到这一点,对于没有使用maven、ant、gradle等的人来说,这是强制性的。@Maude感谢您的反馈。这就是为什么我用粗体的新行提示添加了答案。我找了好几天,直到我通过与自动生成的清单进行比较才发现这一点。哈,谢谢。我只是在那条新线上撞了头。这对我来说也很管用。如果您正在使用Jetbrains IntelliJ,请尝试
<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        ...
        ...
        ...
  </pluginManagement>
</build>