----. jar Netbeans中的“No Main Manifest Attribute”

时间:2012-09-04 15:29:18

标签: java maven netbeans jar manifest.mf

我最近刚刚开始在Java中使用Maven。时间来测试我的项目,它在NetBeans窗口中运行正常,运行App.java(com.MyCompany.App)中的主类,但是当我尝试从命令行运行它时出现错误:

java -jar fileName.jar
   fileName.jar中的“No Main Manifest Attribute”

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

发生了什么事?

6 个答案:

答案 0 :(得分:13)

我知道这是一个老问题,但万一它可以帮助任何人。

你需要maven-jar-plugin(见Maven's example)。该插件将在构建项目时创建Rp在清单文件中提到的必需条目。

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

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

答案 1 :(得分:10)

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

  • 应该在/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

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

答案 2 :(得分:2)

您可以将它用于命令行:

java -cp jarFileName.jar full.package.className

在这种情况下,你不必深入了解Manifest文件的细节。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我一直在使用Netbeans 8.0和“Java Application”项目原型的内置Maven项目。我也有Maven 3,我发现网上的一些建议也与Netbeans使用的maven代码不匹配。

无论如何,这里有一个简单的方法,让JAR文件运行main-class并嵌入依赖库。我通过比较我发现与子项目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包
  • mainClass .....使用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>

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

答案 5 :(得分:0)

使用JAR工具设置入口点:

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

jar cfe app.jar MyApp MyApp.class

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

java -jar app.jar

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

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