java - 不能执行jar文件: “no main manifest attribute”

我安装了一个应用程序,当运行它(它是一个可执行的jar )时,什么也没发生,当我使用命令行运行它时:

java -jar "app".jar

我得到以下消息:

no main manifest attribute ,in " app".jar

时间:

看到你运行 java -jar "app",而不是java -jar app.jar,这是奇怪的做法。

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

文件本身应该有(至少):


Main-Class: com.mypackage.MyClass

其中,com.mypackage.MyClass是保存public static void main(String [] args)入口点的类。

对于CLI,执行以下操作: 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>2.4</version>
 <configuration>
 <archive>
 <manifest>
 <addClasspath>true</addClasspath>
 <classpathPrefix>lib/</classpathPrefix>
 <mainClass>com.mypackage.MyClass</mainClass>
 </manifest>
 </archive>
 </configuration>
 </plugin>
 </plugins>
</build>

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

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

只有JAR文件是可执行JAR文件时,-jar选项才有效,这意味着它必须有一个Manifest文件,其中包含Main-Class属性,

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


java -cp app.jar com.somepackage.SomeClass

其中,com.somepackage.SomeClass是包含运行程序的main方法的类,

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

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


Main-Class: <packagename>.<classname>

当MANIFEST.MF文件中缺少此行时,会出现此"no main manifest attribute"错误。

更新:我刚刚找到了一种在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.

enter image description here


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

任何可以执行jar文件都应该通过单击或者运行命令提示符来运行,如 -jar app.jar ( 使用"如果jar路径包含空间"- 换句话说,-jar"c: folder nameapp 。jar") 。 如果可执行文件没有运行,这意味着它没有正确创建。

为了更好地理解,提取jar文件( 或者使用任何工具查看 Windows 7 -Zip的工具) 并在/META-INF/MANIFEST.MF. 下检查文件,如果你发现

Main-Class: your.package.name.ClaaswithMain - 然后就可以了,否则你必须提供它。

注意附加Main-Class条目 MANIFEST.MF 文件,检查你在哪里保存它!

如果jar没有遵循规则,它就不是一个可执行的jar 。

尝试这个命令来包含jar :


java -cp yourJarName.jar your.package..your.MainClass

另外,你可以使用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> 

在本例中,部分中指定的所有依赖项jars都将自动包含在你的单个jar中。

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

我们通常使用 java -jar app.jar 下面的语法

如果你的jar不可执行,那么你可以看到这样的错误:没有主 Manifest 属性

...