2016-03-28 45 views
1

我已经搜索谷歌和StackOverflow的解决方案,到目前为止没有发现。我试图使用Java 1.8的Windows命令行中的清单文件生成一个简单的可执行文件.jar包。相关文件是:使用jar.exe与清单文件的可执行文件 - “没有主清单属性”

Turtlephilia.java:

public class Turtlephilia { 
    public static void main(String[] args) { 
     System.out.println("i lurrrve turtles"); 
    } 
} 

MANIFEST.MF:

Main-Class: Turtlephilia 

do.bat:

javac Turtlephilia.java 

jar cvmf manifest.mf Turtlephilia.jar Turtlephilia.class 

java -jar Turtlephilia.jar 

当我执行do.bat它编译并成功存档,但在运行jar文件时,它会生成此错误:

no main manifest attribute, in Turtlephilia.jar 

注:我其实能够与此命令成功运行:

java -cp Turtlephilia.jar Turtlephilia 

但我需要的是一个可执行的JAR。

我在做什么错?它能有多难!?

+0

你碰巧用记事本创建了你的manifest.mf吗?我怀疑在开始时有一个不可见的[字节顺序标记](https://en.wikipedia.org/wiki/Byte_order_mark)(BOM)字符,这意味着该行在技术上并不以'Main-Class'开头。解决方案:在Main-Class上添加一个空白行。 – VGR

+0

我没有在记事本中编辑,但添加一个空行后,我得到同样的问题。顺便提一下,我注意到的是,如果我将.jar拖入Netbeans并查看,那么在META-INF \ MANIFEST.ms下的包中,它具有Manifest-Version:1.0的默认清单,Created-By:...没有我的Main-Class系列。它只是完全忽略我的清单文件? –

+0

哦,男人。你在正确的轨道上。 Main-Class是清单文件的最后一行,它需要一个回车符。 –

回答

1

嗯,我找到了原因。

我在记事本中创建了manifest.mf文件,并为Main-Class创建了一行。

原来,它需要一个回车后,这条线识别它,即。最后一个空行。

一直在我的头撞墙的几个小时,我没有被Java开发环境所迷住。

+0

记事本不是源代码编辑器。使用记事本和归咎于Java就像使用'wget'浏览网页并指责StackOverflow难以使用。 – dimo414

+0

我不同意。无法处理存在/不存在尾随空间是非常糟糕的,并且在失败时不能产生任何有用的警告。无论如何,IDE是否经常为文本文件添加尾随空格?我假设没有,那他们为什么会有不同? –

+0

一般来说,我会同意你的看法;程序应该优雅地失败。但是,这种优雅的限制 - 你不能期望程序总是在[垃圾输入]面前表现得合理(https://en.wikiquote.org/wiki/Charles_Babbage#Passages_from_the_Life_of_a_Philosopher_.281864.29)。而你的假设虽然合理,但是不正确。文本文件[预计会以新行结束](http://unix.stackexchange.com/q/18743/19157)([background](http://stackoverflow.com/q/729692/113632)),记事本无法在文件的末尾添加新行就会导致行为不佳。 – dimo414