----.jar Netbeans 中的“无主清单属性”

问题描述 投票:0回答:7

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

java -jar fileName.jar

fileName.jar 中“无主清单属性”

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

发生什么事了?

java maven netbeans jar manifest.mf
7个回答
19
投票

您需要

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

<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
从包层次结构开始。


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

这些类型的问题很琐碎,但会浪费大量时间,只需确保文件的内容和位置正确即可。


4
投票

您可以将其用于命令行:

java -cp jarFileName.jar full.package.className

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


1
投票

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

1
投票

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


0
投票

我在使用 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包
  • 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>

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


0
投票

也许你的项目属于Java with Maven的类别。如果您只是构建常规 Java 应用程序,我建议选择 Java with Ant,然后在“项目”下选择“Java 应用程序”。要进行测试,请尝试在项目包中添加 jFrame,然后选择清理并构建项目,这将生成包含 dist 和项目的 jar 文件的文件夹,您将能够毫无问题地运行它。

© www.soinside.com 2019 - 2024. All rights reserved.