无法执行二进制文件 - 可执行的Jar文件

3
我在尝试使用Makefile运行一个可执行的jar文件时遇到了困难。需要任何帮助。
$ ./HelloWorld
-bash: ./HelloWorld: cannot execute binary file

$ file HelloWorld
HelloWorld: Zip archive data, at least v2.0 to extract

$ ls -l
total 32
-rwxr-xr-x  1 myMac  staff  773 Jan 17 06:55 HelloWorld
-rw-r--r--  1 myMac  staff  427 Jan 17 06:55 HelloWorld.class
-rw-r--r--  1 myMac  staff  120 Jan 17 05:52 HelloWorld.java
-rw-r--r--  1 myMac  staff  304 Jan 17 05:59 makefile

这是我使用的两个文件。
HelloWorld.java
class HelloWorld{
 public static void main(String[] args){
 System.out.println("Hello, world!");
 }
}

makefile

HelloWorld: HelloWorld.class
    echo Main-class: HelloWorld > Manifest
    jar cvfm HelloWorld Manifest HelloWorld.class
    rm Manifest
    chmod +x HelloWorld
HelloWorld.class: HelloWorld.java
    javac -Xlint HelloWorld.java

这一切都在普林斯顿课程材料中描述,其中也包括答案。 - Brian Tompsett - 汤莱恩
@BrianTompsett 谢谢,我刚刚查看了你发送的链接。然而他们使用 $java HelloWorld 来运行 HelloWorld.class。 我可以做到这一点。我正在尝试创建一个可执行文件,以便只需键入 $./HelloWorld 即可运行程序。 - sweepez
正如Tom在下面所说的那样,普林斯顿课程中描述的一切都是正确的。这就是世界的做法。你真的需要与你们学校的导师核实为什么他们的计算机会有不同的做法。也许他们使用了一个不同的Java编译器来生成可执行代码,但这并不是全世界使用的标准编译器。当你的学校显然在做不同的事情时,我们很难回答你的问题;要么你误解了什么。唯一知道的方法就是去学校问。Tom和我所说的都是正确的,这也是为什么我们给你提供了链接的原因。 - Brian Tompsett - 汤莱恩
@BrianTompsett 感谢您的帮助尝试。我们已经按照“全世界”的方式进行编译。我们使用 $ javac 进行编译,$ java 进行运行。我的问题是关于如何使用 makefile 创建可执行的 jar 文件。我的问题已得到解答。 - sweepez
1个回答

2
这个命令:
jar cvfm HelloWorld Manifest HelloWorld.class

创建一个jar文件(如file HelloWorld所示,jar文件是类似于ZIP归档文件的文件)。这不是可以像./HelloWorld那样运行的“普通”二进制文件。您需要使用Java来运行它:
java -jar HellorWorld

我建议将上面的代码更改为以下内容:
jar cvfm HelloWorld.jar Manifest HelloWorld.class

因此,这将清楚地表明那个文件是什么。

顺便提一下,由于HelloWorld不是二进制文件,所以您不需要使用命令chmod +x HelloWorld


谢谢Tom,我能做出哪些更改以便将其作为二进制文件运行吗?当我使用终端通过ssh连接到学校的UNIX环境时,只需使用./HelloWorld即可正常运行该文件。 这是教授给出的makefile指令,我希望不必在本地机器上使用$ java -jar HelloWorld来运行该文件,而是只需使用./HelloWorld。 - sweepez
你有检查过他们的 HelloWorld 吗?它可能只是一个简单的 shell 脚本,调用了真正的 Java 程序。 - Tom
他们的 HelloWorld 和我上面提供的一样。 - sweepez
@sweepez 或许这个回答可以帮助你完成这个任务。 - Tom
1
感谢您的帮助。是的,学校应该运行一些脚本来仅使用文件名运行jar文件。我会查一下。 - sweepez
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接