注意-我已经解决了这个问题,为了其他人的利益,我会发布答案。 请注意,我确实查看了此错误的其他答案,但它们并未涵盖此处发生的情况。
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
我用记事本写的 list 文件
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
我看了这个问题的其他答案,他们建议添加一个 list 文件
但是 list 文件在jar里
C:\blah>jar -tf asdf.jar
META-INF/
META-INF/MANIFEST.MF
a.class
a.java
manifest
C:\blah>
最佳答案
当我用记事本写 list 文件时,它的末尾没有换行。这就是导致错误的原因。
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
如我们所见,它失败了,因为 list 文件末尾没有换行
将新行添加到 list 文件的末尾。这也可以在记事本中完成
C:\blah>echo.>>manifest
list 文件的内容
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 文件..因为向 list 文件添加了新行
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>
关于java - 没有主要 list 属性(但我在 jar 中有 list 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25190921/