无法执行jar文件:"没有主要清单属性"

Ewo*_*oud 875 java program-entry-point jar manifest

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

java -jar"app.jar"

我收到以下消息:

"app.jar"中没有主要的清单属性

通常,如果我自己创建了程序,我会在清单文件中添加一个主类属性.但在这种情况下,由于文件来自应用程序,我不能这样做.我也尝试提取jar以查看是否可以找到主类,但是有许多类,并且它们中没有一个在其名称中包含"main"一词.必须有办法解决这个问题,因为程序在其他系统上运行正常.

Oli*_*alo 847

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

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

文件本身应该(至少)这一个班轮:

Main-Class: com.mypackage.MyClass
Run Code Online (Sandbox Code Playgroud)

哪个com.mypackage.MyClass类持有public static 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>
Run Code Online (Sandbox Code Playgroud)

(选择<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>
Run Code Online (Sandbox Code Playgroud)

致谢Michael Niemand -

对于Gradle:

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Ant中,<jar>元素中的<manifest> <attribute name ="Main-Class"value ="com.mypackage.MyClass"/> </ manifest> (14认同)
  • 如何"jar一个名为META-INF/MANIFEST.MF的文件"?我一方面有.jar,另一方面有.MF,如何将它们链接在一起?我将清单放在与.jar相同的文件夹中,但它不起作用我仍然遇到问题! (4认同)
  • @Wicelo要在创建jar文件时指定特定的MANIFEST.MF文件,请使用jar的_m_标志.例如.`jar cmvf META-INF/MANIFEST.MF <new-jar-filename> .jar <要包含的文件>` (4认同)
  • 谢谢你。只是想补充一点,您可以使用以下命令将依赖项复制到 lib 文件夹:http://stackoverflow.com/a/996915/1121497。由于类路径包含该 `lib` 文件夹,因此您只需要使用 `java -jar myproject.jar` 执行 jar,它就会找到依赖项。 (2认同)
  • 注意:对于 Maven,我在 VSC 生成的 Maven 文件中已经有一个 `maven-jar-plugin` 项,所以我只是向其中添加了 `&lt;configuration&gt;` 部分。 (2认同)

Jes*_*per 253

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

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

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

java -cp app.jar com.somepackage.SomeClass
Run Code Online (Sandbox Code Playgroud)

com.somepackage.SomeClass包含main运行程序的方法的类在哪里.(该课程取决于该课程,从您提供的信息中无法判断).

  • 感谢您的回复,但只有当我知道包含main方法的类的名称时,您的解决方案才有效.这是一个错字...它应该是"app.jar".但是,如何通过双击文件来解释为什么它在其他系统上运行? (3认同)
  • @Jesper您好,如果eclipse使用默认软件包怎么办?我只输入班级名称吗? (2认同)

Cod*_*rew 112

或者,您可以使用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> 
Run Code Online (Sandbox Code Playgroud)

在此示例中,部分中指定的所有依赖项jar将自动包含在您的单个jar中.请注意,jar-with-dependencies应该按字面意思放置,而不是替换为要包含的jar文件名.

  • 完美,这是有效的.它将所有依赖项捆绑到一个jar中,从而允许您编译/构建项目并开箱即用. (3认同)
  • 这与`maven-assembly-plugin` 一起工作。`maven-jar-plugin` 没有。 (3认同)
  • 注意:把这段代码放在你的`pom.xml`文件里面`&lt;build&gt;&lt;plugins&gt; PUT IT HERE &lt;/plugins&gt;&lt;/build&gt;`然后执行maven Package(在IDEA打开maven右侧的滑动菜单,看项目 &gt; 生命周期 &gt; 包)。然后您的 jar 文件将在 Target 文件夹中。干杯! (3认同)
  • 在 [shade plugin](https://maven.apache.org/plugins/maven-shade-plugin/index.html) 的上下文中,必须遵循 [Executable JAR](https://maven .apache.org/plugins/maven-shade-plugin/examples/executable-jar.html)。 (2认同)

Sas*_*uri 59

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

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

Main-Class: <packagename>.<classname>
Run Code Online (Sandbox Code Playgroud)

当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.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


QED*_*QED 30

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 27

对于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>
Run Code Online (Sandbox Code Playgroud)

干杯...


mor*_*tar 26

使用IntelliJ IDEA创建jar时遇到了这个问题.见这个讨论.

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

否则它在jar中包含一个清单文件,但不包括它应该具有的 - /src/main/java中的清单文件.

  • 感谢您为我的桌面节省了不受其他任何工作方式的纯粹挫败感所困扰;)您的链接似乎断开了,但是我可以确认这是完美的。已通过IntelliJ IDEA 2018.2.5(社区版)测试 (2认同)

Nag*_*tti 25

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

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

  • 工作完美,但考虑添加截至 2018 年 4 月的版本 &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;version&gt;2.0.1.RELEASE&lt; /版本&gt; &lt;/插件&gt; (2认同)

Bur*_*RAS 24

尝试此命令以包含jar:

java -cp yourJarName.jar your.package..your.MainClass
Run Code Online (Sandbox Code Playgroud)


eis*_*eis 13

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

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

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


小智 10

如果使用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>
Run Code Online (Sandbox Code Playgroud)

  • 我认为没有理由拒绝这个答案.如果您没有使用`spring-boot`,请忽略它.Stackoverflow还有助于构建您在编程时遇到的自己的问题库. (4认同)
  • 谁说这是一个Spring Boot项目? (3认同)
  • @ james.garriss好吧,我会说,我来到这篇文章中搜索“无主要清单属性”错误,但是我正在从事Spring Boot应用程序,因此此答案对我有所帮助。我已经知道如何创建`META-INF / MANIFEST.MF`文件,但是不知道如何使spring-boot自动处理它。 (2认同)

Reg*_*ser 9

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


Bin*_*kot 9

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*n M 7

如果jar不遵守规则,那么它不是可执行jar.


小智 6

我找到了一个新的解决方案来解决不良清单生成问题!

  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

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


小智 5

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

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

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

  1. 在此之后,将Java Dynamic项目导出为"Runnable JAR"文件而不是JAR文件.

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

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

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

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


And*_*rey 5

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class
Run Code Online (Sandbox Code Playgroud)

(参数“e”这样做:TheNameOfClassWithMainMethod 是一个类的名称,方法为 main() 和 app.jar - 可执行文件 .jar 和 *.class 的名称 - 只是要组装的所有类文件)


Cod*_*key 5

我有同样的问题。这里提到的很多解决方案都没有给出我的全貌,所以我会尝试给你一个如何从命令行打包jar文件的摘要。

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

    测试.java

    package testpackage;
    
    public class Test
    {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. .class使用以包名称给出的结构结尾的文件编译代码,请使用:

    javac -d . Test.java
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    然后是入口点。

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

    jar cvfeP test.jar testpackage.Test -C . testpackage/
    
    Run Code Online (Sandbox Code Playgroud)
  4. .jar在 zip 程序中检查您的文件。它应该具有以下结构

    测试文件

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class
    
    Run Code Online (Sandbox Code Playgroud)

    MANIFEST.MF 应包含以下内容

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test
    
    Run Code Online (Sandbox Code Playgroud)

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

  5. 执行你的.jar文件

    java -jar test.jar
    
    Run Code Online (Sandbox Code Playgroud)


dja*_*fan 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
Run Code Online (Sandbox Code Playgroud)

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


Yur*_*nko 5

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

  1. 将yourjar.jar重命名为yourjar.zip
  2. 从META-INF \ MANIFEST.MF中打开MANIFEST.MF文件
  3. 通过MAVEN复制已经在您的项目中生成的真实MANIFEST.MF,其中包括:Manifest-Version:1.0 Main-Class:youpacket.youmainclass
  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.1.2</version>
            <configuration>
                <archive>
                    <manifestFile>/src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                    <index>true</index>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

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

  1. 将以下代码添加到您的pom.xml中:

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <archive>
                    <index>true</index>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                    <manifestEntries>
                        <mode>development</mode>
                        <url>${project.url}</url>
                        <key>value</key>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</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>
                    </manifest>
                    <manifestEntries>
                        <mode>development</mode>
                        <url>${project.url}</url>
                        <key>value</key>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
    
    Run Code Online (Sandbox Code Playgroud)

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


Dar*_*hah 5

我尝试过这个,它对我有用。mvn clean 安装包应该可以工作。

<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>
Run Code Online (Sandbox Code Playgroud)