【问题标题】:What is needed to launch external JAR files, like the Minecraft launcher?启动外部 JAR 文件(如 Minecraft 启动器)需要什么?
【发布时间】:2011-12-27 13:03:33
【问题描述】:

如果您从未玩过 Minecraft,那么这就是启动器机制的工作原理。

用户可以下载一个 JAR(或打包成 EXE 的 JAR),它完全没有 Minecraft 客户端的代码。这被视为启动器。当启动器启动时,它会显示一个包含新闻等的登录屏幕。然后,登录后,启动器会运行主要的 Minecraft 核心,minecraft.jar。如果系统上不存在它,它会下载它。 Minecraft 启动器也不需要任何外部 Java 库即可运行。

它是如何做到的?

我目前正在尝试复制该功能,但是,当我在 Eclipse 中导出为可运行 JAR 时,当我尝试启动它时,它会打印“找不到主类 launcher.jar。程序将退出”(这是在控制台上,我希望能够双击 JAR 并启动它)

File file = new File(System.getProperty("user.dir") + "/lessur.jar"); 
System.setProperty("org.lwjgl.librarypath", System.getProperty("user.dir") + "natives");
URLClassLoader classLoader;
classLoader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()});          
classLoader.loadClass("zombie.engine.Lighting2").newInstance();

【问题讨论】:

    标签: java jar external launcher minecraft


    【解决方案1】:

    可运行的 JAR 需要一个 Manifest 来指示要使用的主类。从 eclipse 导出时,一个选项是选择一个运行配置(例如从以前的测试运行中),然后 eclipse 使用该信息来填充清单。

    更新:再想一想,根据上面的输出和下面的 cmets,我猜你正在尝试使用命令行中的“java”命令运行 jar .如果是这种情况,您需要使用:
    java -jar launcher.jar
    不是:
    java launcher.jar

    这是我认为你看到的复制品:

    C:\Users\Tim\Desktop>java launcher.jar
    线程“main”中的异常 java.lang.NoClassDefFoundError: launcher/jar 原因:
    java.lang.ClassNotFoundException:launcher.jar
    在 java.net.URLClassLoader$1.run(未知来源)
    在 java.security.AccessController.doPrivileged(Native Method)
    在 java.net.URLClassLoader.findClass(未知来源)
    在 java.lang.ClassLoader.loadClass(未知来源)
    在 sun.misc.Launcher$AppClassLoader.loadClass(未知来源)
    在 java.lang.ClassLoader.loadClass(Unknown Source)
    找不到主类:launcher.jar。程序将退出。

    C:\Users\Tim\Desktop>java -jar launcher.jar

    【讨论】:

    • 我已经完成了,这是导出的 JAR 中的 MANIFEST.MF 的内容 - Manifest-Version: 1.0 Class-Path: 。主类:Main
    • 大概你在那个 JAR 中有一个名为 Main.class 的类(没有包),并且该类包含一个格式正确的 main 函数?
    • 好的,您是双击launcher.jar 文件还是尝试使用“java”命令行运行它?我的猜测是两者中的后者。我已经更新了我的答案。
    • 我双击它,它不会产生任何输出,然后我通过命令行启动它来调试发生了什么。
    • 您是否使用我提到的-jar 选项启动它? java -jar launcher.jar
    【解决方案2】:
    // Use the File constructor that will insert the correct separator for the OS
    File file = new File(System.getProperty("user.dir"), "lessur.jar"); 
    System.out.println( "File exists: " + file.exists() );
    File libs = new File(System.getProperty("user.dir"), "natives");
    System.out.println( "Libs exists: " + libs.exists() );
    System.setProperty("org.lwjgl.librarypath", libs.toString());
    

    【讨论】:

      【解决方案3】:

      你应该试试Java Decompiler

      【讨论】:

        猜你喜欢
        • 2018-02-23
        • 2011-06-03
        • 2017-10-10
        • 1970-01-01
        • 2018-10-22
        • 2021-07-28
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多