分发Java应用程序

5

我最近开发了一些Java应用程序,希望其他人能在他们的计算机上运行。我做了一些研究,现在知道要分发Java代码,需要创建.jar文件。我已经这样做了,但是当我分发这些文件时,它在一些计算机上运行,但在其他计算机上返回一个错误,显示“找不到主类”。

  1. JRE版本是否有问题?
  2. 用户如何知道应该在哪个版本上运行应用程序?
  3. 我可以将正确的JRE版本与我的应用程序/JAR文件打包吗?如何操作?
  4. JAR文件是否与编译时使用的JRE版本之外的其他版本不兼容?

你是如何创建JAR文件的(使用了哪些选项,是否包含了带有Main-Class的清单文件),以及你是如何尝试运行程序的? - Adam Batkin
我使用命令“jar xyz.jar manifest.mf *.class”在cmd中将manifest.mf文件与jar文件一起打包。我希望只需双击即可在任何计算机上运行它。它可以在安装了jre 7的某些计算机上运行,但在低版本上则会出现上述错误。 - anichhangani
你使用的是哪个JDK版本进行编译? - Alan Krueger
2
+1;好问题。在软件分发方面,尤其是在Java中,您面临着一个普遍的问题。不幸的是,解决起来并不那么容易。在开发和构建过程中,您可能需要做出(并传达)某些决策(最小/最大JRE版本、JRE供应商、受支持的操作系统、操作系统的行为,例如双击JAR等)。所有这些因素都会影响您的构建过程。我想说的是,您只需要解决它-抱歉... - home
除非您有一些特定于JDK7的代码,否则最好使用尽可能低版本的JDK进行编译。这样,任何具有更高版本JRE的人都可以使用它。 - Abe
显示剩余2条评论
3个回答

2
选项1:创建一个包含以下条目的清单文件,并将其包含在jar中:
     Main-Class: MainProgram

选项2:只需在运行程序时提到您的Main类名称,例如,如果您的jar名称为myprogram.jar,主类为MainProgram,则按以下方式运行程序:

        java -cp myprogram.jar MainProgram

如果您的MainProgram需要一些参数,则在命令行中也要传递它们,例如:
       java -cp myprogram.jar MainProgram argument1 argument2

我已经这样做了,它在一些机器上运行,但在一些其他机器上,其JRE版本与应用程序编译的版本不同,它无法工作。 - anichhangani
@AnirudhChhangani:当程序没有运行时,您确定会出现“找不到主类”错误吗? - Yogendra Singh
2
@AnirudhChhangani 我敢打赌,那些无法运行的机器上安装的JRE版本比你编译时使用的JDK版本要旧。最简单的解决方案是为较旧的Java版本设置--target标志,以便你的程序可以在这些机器上运行。 - Code-Apprentice
@AnirudhChhangani:好的,您需要提供一份最低软件要求的文档,并确保用户已经满足这些要求。 - kosa
1
如果您正在使用Ant,则请参考javac任务。它有一个名为target的属性。请参考javac交叉编译规范。这也有目标选项。 - Yogendra Singh
显示剩余8条评论

0

一些SDK(如Eclipse)具有创建jar文件的功能。如果您在控制台上工作,这可能会帮助您创建稳定的jar文件:

'jar cfm className.jar MANIFEST.MF className.class'


0
  1. 这个应该不重要,除了第四点。
  2. 你需要告诉他们所需的最低版本。
  3. 你可以这样做,但是你可能需要创建一个安装程序,这比jar文件更复杂。
  4. 通常情况下,如果您的用户至少拥有与您编译时相同的VM版本,则是的。您在jar包中打包的类文件针对某个JRE版本,并且它们的格式会不时更改。较高版本的JRE支持较低版本的类文件。

错误消息表明JRE找不到您的主类。从注释中看来,您没有正确指定清单。它是否包含在jar文件内的META-INF目录中?jar -tf my_jar.jar 告诉您什么?

如果您担心JRE版本,请尝试在javac命令中指定较低的目标版本。您可以通过在javac调用中添加-target xx和可能还有-source xx来实现此目的。请查看javac -help以获取有关标志的描述。


清单文件位于 META-INF 目录下。上述命令会列出 JAR 文件中所有类的列表。如何在较低版本中编译程序?请指定命令。 - anichhangani
1
只需将 -target my_version 添加到您的 javac 命令中即可。但是,您需要确保不使用来自更新版本的任何 API。 - jackrabbit
请查看 javac -help - jackrabbit
当我尝试使用命令"javac -target 1.6 xyz.java"编译它时,会返回一个错误,指出目标版本1.6与默认源代码版本1.7冲突。我该如何纠正这个问题? - anichhangani

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