【问题标题】:"No Main Manifest Attribute" in ----.jar Netbeans----.jar Netbeans 中的“无主要清单属性”
【发布时间】:2012-08-29 07:19:16
【问题描述】:

我最近刚刚开始在 java 中玩弄 Maven。是时候测试我的项目了,它在 NetBeans 窗口中运行良好,运行 App.java (com.MyCompany.App) 中的主类,但是当我尝试从命令行运行它时出现错误:

java -jar fileName.jar

fileName.jar 中的“No Main Manifest Attribute”

我尝试添加一个 manifest.mf 文件来指定 main 是什么,我也进入了项目属性并将其添加为主文件...

发生了什么事?

【问题讨论】:

标签: java maven netbeans jar manifest.mf


【解决方案1】:

您需要maven-jar-plugin(请参阅Maven's example)。该插件将在项目构建时在清单文件中创建所需的条目。

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

您需要版本,否则项目将无法构建。 fully.qualified.MainClass 从包层次结构开始。

【讨论】:

  • 这是最有帮助的答案,IMO 应该是这篇文章的主要答案。
【解决方案2】:

希望您的清单文件有问题。一些基本检查可能会解决您的问题。

  • 应该在/META-INF/MANIFEST.MF
  • 内容应该有Main-Class:com.MyCompany.App

如果您使用任何 IDE,应该有一个选项将项目导出为runnable jar,您可以利用它让 IDE 处理正确的清单。

从命令行jar cfm filename.jar Manifest.txt com/MyCompany/*.class 生成具有以下内容的清单文件

Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: com.MyCompany.App

然后你可以运行jar命令java -jar fileName.jar

这些类型的问题是微不足道的,但会浪费大量时间,只需确保文件的内容和位置正确即可。

【讨论】:

  • 我试了一下,尝试 java jar cfm testSql-1.0.jar Manifest.txt com/MyCompany/testsql/*.class 并返回错误“无法找到或加载主类 jar”
  • 清单文件末尾有空行吗?最后一行不会在清单文件中解析。
  • 我的清单显示如下: Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: dbell Build-Jdk: 1.7.0_05 虽然它是由 IDE 生成的
  • 在 Netbeans 中,运行->项目配置->自定义->运行->主类->浏览并选择您的主类。然后重新构建。
  • @Pete 这不适用于 NetBeans 中的 Maven 项目。它仅适用于 npproject 管理的项目
【解决方案3】:

您可以将其用于命令行:

java -cp jarFileName.jar full.package.className

在这种情况下,您不必详细了解 Manifest 文件。

【讨论】:

  • 虽然您的选项是一个有效的选项,但它并不能准确回答“发生了什么?”问题的一部分。
  • @adamdunson “发生了什么”与所涉及的 IDE 直接相关。对于 NetBeans,Nate 在上面发布了正确的解决方案。
【解决方案4】:

使用 JAR 工具设置入口点:

“e”标志(用于“入口点”)创建或覆盖清单的 Main-Class 属性。它可以在创建或更新 JAR 文件时使用。使用它来指定应用程序入口点,而无需编辑或创建清单文件。 例如,此命令创建 app.jar,其中清单中的 Main-Class 属性值设置为 MyApp:

jar cfe app.jar MyApp MyApp.class

您可以通过运行以下命令直接调用此应用程序:

java -jar app.jar

如果入口点类名在包中,它可以使用'.' (点)字符作为分隔符。例如,如果 Main.class 在名为 foo 的包中,则可以通过以下方式指定入口点:

jar cfe Main.jar foo.Main foo/Main.class

【讨论】:

    【解决方案5】:

    如果您查看项目的属性对话框(从项目选项卡,右键单击您的项目并选择属性),您会看到“类别”窗口中有一个“运行”项。单击它,您将看到一个对话框,您可以在其中指定 jar 的 Main Class。该信息最终会出现在您的清单中。

    【讨论】:

      【解决方案6】:

      Netbeans 8.0 和“Java 应用程序”项目原型的内置 Maven 项目一直存在这个问题。我也有 Maven 3,我发现网上的一些建议与 Netbeans 使用的 Maven 代码也不匹配。

      无论如何,这里有一个让 JAR 文件运行主类和嵌入依赖库的简单方法。我通过比较我发现与子项目 JAR-s 一起工作的项目的其他项目 POM 文件来完成这项工作,所以如果有更好的 Maven 知识的人发现 gottcha,请说。另外,我留下了一些正常的东西来提供上下文。示例如下:

           <properties>
               <packageName>trials.example</packageName>
               <mainClass>${packageName}.CmdApp</mainClass>
               <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      
               <slf4jVersion>1.7.7</slf4jVersion>
               <log4jVersion>1.2.17</log4jVersion>
      
               <maven.compiler.source>1.8</maven.compiler.source>
               <maven.compiler.target>1.8</maven.compiler.target>
           </properties>
      

      本节向 Maven 介绍该项目。

      • packageName ...是主类的Java包
      • ma​​inClass ..... 具有 main() 方法的类的完全限定名。

      您将看到这些在 maven-jar-plugin 中使用。

      内置示例原型没有做的另一件事是将我的子项目打包到 JAR 中,以便我可以从命令行运行。这是通过下面的 maven-dependency-plugin 完成的。有趣的是我们不需要打包系统的东西,我们希望将依赖的类打包到我们的 JAR 中。

      这些用法如下:

           <build>
               <plugins>
                   <plugin>
                       <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-dependency-plugin</artifactId>
                       <version>2.6</version>
                       <executions>
                           <execution>
                               <id>unpack-dependencies</id>
                               <phase>package</phase>
                               <goals>
                                   <goal>unpack-dependencies</goal>
                               </goals>
                               <configuration>
                                   <excludeScope>system</excludeScope>
                                   <outputDirectory>${project.build.directory}/classes</outputDirectory>
                               </configuration>
                           </execution>
                       </executions>
                   </plugin>
      
                   <plugin>
                       <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-jar-plugin</artifactId>
                       <version>2.5</version>
                       <configuration>
                           <useDefaultManifestFile>true</useDefaultManifestFile>
                           <archive>
                               <manifest>
                                   <mainClass>${mainClass}</mainClass>
                                   <packageName>${packageName}</packageName>
                                   <addClasspath>true</addClasspath>
                                   <classpathPrefix>classes/</classpathPrefix>
                               </manifest>
                               <manifestEntries>
                                  <mode>development</mode>
                                  <url>${pom.url}</url>
                               </manifestEntries>
                           </archive>
                       </configuration>
                   </plugin>
      
                </plugins>
          </build>
      

      希望这可以为您节省几个小时的检查和测试时间。干杯,威尔。

      【讨论】:

      • 你能更新这个答案吗? maven jar 插件已更改..
      • @Human ...谢谢,这是一个好点!对于那里的读者来说,最好的事情是使用最新的文档检查这些要点(以上)。我们的项目现在使用 Gradle,我不在循环中。如果有人想在这里发布答案,很高兴指出更正。
      猜你喜欢
      • 2021-05-29
      • 2022-12-23
      • 2015-10-01
      • 2021-06-15
      • 2020-07-28
      • 2018-02-10
      • 2017-08-18
      • 2021-11-02
      相关资源
      最近更新 更多