65.9K
CodeProject 正在变化。 阅读更多。
Home

Java 桌面应用程序的 EXE 启动器

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2010年10月4日

Apache

3分钟阅读

viewsIcon

37734

downloadIcon

584

JAR 可执行文件的实用启动器,带有启动画面图像功能

引言

许多用户询问如何从 Java SE 项目制作 EXE 文件。 首先,我们必须说从 JAVA 源代码创建 EXE 构建文件是可能的,但它不符合目的,而且是一个非常糟糕的主意!

显而易见的是,虽然 JAR 是一个可执行文件,但对于更多用户(最终用户)来说,EXE 文件可能更方便。 因此,我们的想法是创建一个 EXE 引用文件,它可以运行“java -jar”命令,或者 Windows 使用的“javaw -jar”命令。 网上有更多文章解释如何创建具有相同作用域的 BAT 文件,此外,其他工具可以轻松地将 BAT -> EXE 转换。 现在,为什么不创建一个简单的 EXE 自动化文件来执行这些任务呢?

这是一个简单的工作,可用于中小型项目,这项工作希望成为为您定制的桌面解决方案创建个人 EXE 应用程序启动器的起点。

必备组件

  • Java 运行时 Bin 目录必须在您的系统类路径中。

背景

在后台,我解释了某些方法的使用,例如strtok()一个 tokenizer 函数

char* token = strtok(result, "\\.");
    while (next != "exe") {
        name = next;
        token = strtok(NULL, "\\.");
        next.assign(token);
    }

这是一段源代码。 char* token 变量是 strtok() 存储 main string 片段的地方。

strtok(result, "\\."); 

这将获得结果 string 的第一段,除以两个字符 "\" 和 "." ; 那么为什么是 "\\." ? 因为 "\" 会导致格式错误。 为什么这两个字符会在下一节中解释,但是结果字符串是 EXE 应用程序的简单路径,因此它会迭代每个片段,直到最后一个 "AppName.exe",它会丢弃 "EXE" 并仅保留应用程序的简单名称。

正如你所看到的,strtok() 函数有一个特殊的用途。 该函数的下一次迭代将是

strtok(NULL, "\\."); 

直到 string 的末尾。

Using the Code

无论如何,一张图片胜过千言万语(即使这张图片是一段代码)。 :)

#include <iostream>

#include <fstream>

#include <windows.h>


using namespace std;

string getAppName() {

    // Creates char array with maximum needed length
    char result[MAX_PATH];
    // Uses <windows.h> method to retrieve app name. Only Windows OS
    std::string(result, GetModuleFileName(NULL, result, MAX_PATH));

    char* token;
    string name, next = "";

    //Iterates until end of tokens of Name string, divided by char -> '\' and '.'
    //The only '.' in Filename must be that for ".exe" , error otherwise.
    token = strtok(result, "\\.");
    while (next != "exe") {
        name = next;
        token = strtok(NULL, "\\.");
        next.assign(token);
    }
    return name;
}

int main(int argc, char** argv) {

    ifstream file; // file stream
    string value = "";
    string jar_name = "";
    string image_name = "splash.gif";
    file.open("run.ini");
    if (!file) { // file does not exist, so use standard name
        jar_name = getAppName();
        jar_name += ".jar";
    } else {
        do {
            file >> jar_name;
            file >> image_name;
        } while (!file.eof());
        file.close();
    }

    //Launch JAVAW command on "jar_name" file with "image_name" splash image
    string exec_command = "start javaw -splash:" + image_name + " -jar " + jar_name;
    system(exec_command.c_str());

    return 0;
}

应用程序以两种方式工作。 首先,它在同一文件夹中寻找名为“run.ini”的文件,找到后,它从文件中检索两个 string 值(jar_name, image_name),它们由 RETURN 字符分隔(或者说每行一个 string)。 它的工作是构建一个简单的 exec String,就像这样

  • javaw -splas:image_name -jar jar_name

并调用 system(command) 来执行它,就像你在命令窗口中一样。

如果文件夹中不存在“run.ini”,则应用程序的第二种方式是通过默认参数检索(jar_name, image_name),即 jar_name = ApplicationName.jar(其中 ApplicationName 是 EXE 文件的名称)和 image_name = “splash.gif”。 如前所述,这是一个自定义应用程序启动器的起点,该启动器能够读取自定义配置文件。

对于新手来说,启动画面图像是在应用程序加载时出现的加载图像。 从 JAVA 6 开始,“java” 命令可以直接加载用于启动画面的图像。 因此,这个小应用程序的宝贵用途就是为我们的应用程序加载启动画面。

考虑因素

  • 在源代码中,我们的执行命令前面带有 "start" 键。 这是避免显示控制台窗口的一种方法。
  • EXE 意味着我们在 Windows 平台上(强烈暗示),所以这段代码仅在 Windows 上有效。 为什么? 因为
    std::string(result, GetModuleFileName(NULL, result, MAX_PATH));

    是在 Windows 中检索应用程序名称的方法。 例如,它可能不适用于 Linux。

© . All rights reserved.