注意 - 我已经解决了这个问题,并将为其他人的利益发布答案。 请注意,我确实查看了此错误的其他答案,但他们并没有涵盖此处发生的事情。
C:\blah>type a.java
class a { public static void main(String[] args) { } }
编译
C:\blah>javac a.java
blah中的文件列表
C:\blah>dir /s/b
C:\blah\a.class
C:\blah\a.java
C:\blah\manifest
我在记事本中写的清单文件
C:\blah>type manifest
Main-Class: a
C:\blah>
创建jar
C:\blah>jar cvfm asdf.jar manifest -C . .
added manifest
adding: a.class(in = 247) (out= 187)(deflated 24%)
adding: a.java(in = 56) (out= 55)(deflated 1%)
adding: manifest(in = 13) (out= 15)(deflated -15%)
运行jar
C:\blah>java -jar asdf.jar
no main manifest attribute, in asdf.jar
我查看了问题的其他答案,他们建议添加清单文件
但清单文件在jar
中C:\blah>jar -tf asdf.jar
META-INF/
META-INF/MANIFEST.MF
a.class
a.java
manifest
C:\blah>
答案 0 :(得分:1)
当我在记事本中编写清单文件时,它最后没有新行。这就是导致错误的原因。
Windows使用CRLF作为行分隔符,而Linux使用LF作为行终止符。所以,当我在记事本中写了一行时,它最后没有CRLF。
但是java -jar jarfile.jar
要求Manifest最后有一个新行(在本例中为CRLF)。我的最后没有任何东西。
C:\blah>type manifest
Main-Class: a
C:\blah>
创建jar文件
C:\blah>jar cvfm asdf.jar manifest -C . .
added manifest
adding: a.class(in = 247) (out= 187)(deflated 24%)
adding: a.java(in = 56) (out= 55)(deflated 1%)
adding: manifest(in = 13) (out= 15)(deflated -15%)
执行jar
C:\blah>java -jar asdf.jar
no main manifest attribute, in asdf.jar
我们将看到失败,因为清单文件末尾没有新行
将新行添加到清单文件的末尾。这也可以在记事本中完成
C:\blah>echo.>>manifest
清单文件的内容
C:\blah>type manifest
Main-Class: a
C:\blah>
运行jar文件
C:\blah>java -jar asdf.jar
no main manifest attribute, in asdf.jar
失败,因为仍然是旧的jar文件; - )
创建jar文件..因为在清单文件中添加了新行
C:\blah>jar cvfm asdf.jar manifest -C . .
added manifest
adding: a.class(in = 247) (out= 187)(deflated 24%)
adding: a.java(in = 56) (out= 55)(deflated 1%)
adding: manifest(in = 15) (out= 17)(deflated -13%)
它运行良好没有错误
C:\blah>java -jar asdf.jar
C:\blah>