分布式java应用程序

分布式java应用程序,java,Java,我最近开发了一些java应用程序,我希望其他人在他们的机器上运行。 我做了一些研究,现在知道要分发java代码,需要创建.jar文件。 我这样做了,但当我分发这些文件时,它在一些计算机上运行,但在其他计算机上,它返回一个错误:“找不到主类” JRE版本有什么问题吗 用户如何知道应该在哪个版本上运行应用程序 我可以用app/jar文件打包正确的jre版本吗。怎么做 jar文件与jre的其他版本不兼容,除非它们是在其中编译的 选项1:创建一个清单文件,其条目如下,并包含在jar中: Mai

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

  • JRE版本有什么问题吗
  • 用户如何知道应该在哪个版本上运行应用程序
  • 我可以用app/jar文件打包正确的jre版本吗。怎么做
  • jar文件与jre的其他版本不兼容,除非它们是在其中编译的

  • 选项1:创建一个清单文件,其条目如下,并包含在jar中:

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

            java -cp myprogram.jar MainProgram
    
    如果您的
    main程序
    接受一些参数,它们也会在命令行中传递这些参数,例如

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

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

  • 除第4点外,这不重要
  • 您必须告诉他们所需的最低版本
  • 您可以,但是您可能必须创建一个安装程序,它甚至比jar更复杂
  • 通常是的,如果您的用户有一个VM,那么至少是您编译时使用的版本。您在jar中打包的类文件是针对某个版本的JRE的,它们的格式不时会发生变化。较高版本的JRE支持较低版本的类文件
  • 错误消息表明JRE找不到您的主类。从注释来看,您似乎没有正确指定清单。它是否包含在jar中的META-INF目录中?
    jar-tfmy_jar.jar
    告诉你什么


    如果您担心JRE版本,请尝试在javac命令中指定较低的目标版本。为此,您可以将
    -target xx
    添加到
    javac
    调用中,还可以添加
    -source xx
    。查看
    javac-help
    了解标志的描述。

    您是如何创建JAR的(哪些选项,以及是否包含一个带有主类的清单)以及您是如何尝试运行该程序的?我在cmd中使用“JAR xyz.JAR manifest.mf*.Class”命令将manifest.mf文件包含在JAR中。我需要它应该运行在任何机器上只要双击它。它运行在一些机器上有jre 7,但在较低的版本,它会给出上述错误。你编译它的JDK版本是什么?+1;好问题。当涉及到软件分发时,尤其是在Java中,您将面临一个普遍的问题。可悲的是,这并不是那么容易解决的。在开发和构建过程中,您可能必须做出(并传达)某些决策(最小/最大JRE版本、JRE供应商、支持的操作系统、双击JAR等操作系统行为)。所有这些因素都会影响构建过程。我要说的是,你只需要解决它——抱歉……除非你有一些特定于JDK7的代码,否则最好使用尽可能低的JDK版本进行编译。然后,任何拥有更高版本JRE的人都可以使用它。好吧,我这样做了,它碰巧在一些机器上运行,但在其他一些机器上,它的JRE版本与它编译的应用程序不一样work@AnirudhChhangani:当它不运行时,你确定得到
    Main class not found
    错误吗?是的,绝对是这样……情况是当我将用户的JRE版本升级到应用程序运行时编译的版本…@anirudhchangangani我敢打赌,它不工作的机器的JRE版本比你编译它的JDK版本旧。最简单的解决方案是为旧版本的Java设置--target标志,这样如果您使用的是ant,那么您的程序就可以在上面运行,然后参考。它的属性为
    target
    。参考这也有目标选项。清单在META-INF中。上面的命令给出了jar文件中所有类的列表。如何在较低版本中编译程序..能否指定命令只需将
    -target my_version
    添加到javac命令中即可。但是,您需要确保不使用任何更新版本的API。请查看
    javac-help
    。当我尝试使用命令“javac-target 1.6 xyz.java”编译它时,返回一个错误,表示目标版本1.6与默认源版本1.7冲突。我该如何纠正这个问题??