java - manifest文件 - seal jar




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

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

java -jar“app.jar”

我收到以下消息:

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

通常,如果我自己创建了程序,我会向清单文件添加一个主类属性。 但在这种情况下,由于该文件来自应用程序,所以我无法做到这一点。 我也尝试提取jar来查看是否可以找到主类,但是有很多类,并且它们都没有名称中的“main”这个词。 必须有办法解决这个问题,因为程序在其他系统上运行良好。


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

apply plugin: 'java'

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

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

这是我对基于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>

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


以上答案对我来说只是部分帮助。 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

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

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

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

 java -cp jarfile-name main-classname

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

Manifest-Version:1.0

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

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

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

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

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


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

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

干杯...


对我来说,没有任何答案真的有帮助 - 我在正确的位置上显示了清单文件,包含Main-Class和所有内容。 这让我感到沮丧的是:

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

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


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

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

以下工作:

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

我个人认为,这里的所有答案都是误解了这个问题。 答案就在于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来执行?


我有同样的问题。 这里提到的很多解决方案并没有给我全部的图片,所以我会试着给你一个关于如何从命令行打包jar文件的总结。

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

    Test.java

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

    javac -d . Test.java
    

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

  3. 打包.jar文件时,您需要指示jar例程如何打包。 这里我们使用选项设置cvfeP 。 这是为了保留包结构 (选项P ), 指定入口点,以便清单文件包含有意义的信息(选项e )。 选项f可让您指定文件名,选项c创建归档,选项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
    

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

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

我面临同样的问题,现在已经修复了:)只需按照以下步骤操作,错误可能适用于任何情况,但以下步骤可使流程更流畅。 我花了很多时间来找到修复。

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

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

  1. 之后,将您的Java Dynamic项目导出为“Runnable 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版本。

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


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


检查MANIFEST.MF中的jar文件是否可用Main-Class

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)

[email protected]:~/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

[email protected]:~/Documents$ java -jar first.jar 
Welcome to the world of Java

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


这应该是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在MANIFEST.MF文件中找不到主属性。 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.





main