通过 Windows 快捷方式传递参数运行 .jar

leo*_*gas 5 java windows jar shortcut

是否可以通过Windows快捷方式(.lnk)传递参数来运行.jar?

Har*_*ton 3

在 Java 7 中,是的。您可以根据需要将快捷方式指向c:\windows\system32\java.exejavaw.exe,并包含与命令行上使用的相同参数。

在干净的 Java 8 安装中,这并不容易。不幸的是,Java 8 不再将副本java.exejavaw.exe放入系统文件夹中,而是将符号链接放入 ProgramData 文件夹中。Windows 不喜欢符号链接的快捷方式;有时它们有效,有时则无效。(即使相同的快捷方式也可能适用于某些用户帐户,但不适用于其他用户帐户。)

(似乎如果你在 Java 7 之上安装 Java 8,它会保留旧的行为,但我还没有彻底调查这一点。)

这个简单的启动器可能很有用;您可以使用与 javaw.exe 快捷方式中使用的相同命令行参数创建一个或多个快捷方式。

#include <Windows.h>

void NoCRTMain(void)
{
    wchar_t * cmdline = GetCommandLineW();
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    GetStartupInfo(&si);

    if (!CreateProcess(L"C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe", cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        MessageBox(NULL, L"Unable to launch Java.", L"runjava.exe", MB_OK);
    }

    ExitProcess(0);
}
Run Code Online (Sandbox Code Playgroud)

要在 Visual Studio 中进行编译,您需要更改一些项目设置:

  • 在 C/C++ 代码生成中将缓冲区安全检查设置为“否”
  • 在链接器输入中将所有默认库忽略为“是”
  • Linker Advanced 中 NoCRTMain 的入口点
  • 高级链接器中的随机基址为“否”(请参阅​​此处的评论

(或者您可以将 main 函数从 NoCRTMain 更改为 WinMain,但随后您需要安装 C 运行时或静态链接它。)


另外:在 Windows 10 中,如果有两个“开始”菜单快捷方式指向同一可执行文件,则“开始”菜单中只能看到其中一个。因此,在这种情况下,您需要拥有启动器的多个副本,每个快捷方式一个。