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

Java 通过Windows快捷方式传递参数运行.jar,java,windows,jar,shortcut,Java,Windows,Jar,Shortcut,可以通过Windows快捷方式(.lnk)运行.jar并传递参数吗?在Java 7中,可以。您可以根据需要将快捷方式指向c:\windows\system32\java.exe或javaw.exe,并包含在命令行上使用的相同参数 在干净的Java8安装中,这并不容易。不幸的是,Java8不再将副本Java.exe和javaw.exe放在系统文件夹中,而是将符号链接放在ProgramData文件夹中。Windows不喜欢符号链接的快捷方式;他们有时工作,有时不工作。(即使相同的快捷方式也可能适用于

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

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

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

(如果您在Java7之上安装Java8,它似乎保留了旧的行为,但我还没有对此进行彻底的研究。)

这个简单的发射器可能有用;您可以使用与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);
}
#包括
void NoCRTMain(void)
{
wchar_t*cmdline=GetCommandLineW();
STARTUPINFO si;
处理信息;
GetStartupInfo&si;
如果(!CreateProcess(L“C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe),cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
MessageBox(NULL,L“无法启动Java.”,L“runjava.exe”,MB_OK);
}
退出过程(0);
}
要在Visual Studio中编译,您需要更改某些项目设置:

  • C/C++代码生成中缓冲区安全检查为否
  • 在链接器输入中将所有默认库忽略为“是”
  • 高级链接器中NoCRTMain的入口点
  • 链接器高级()中的随机基址为否
(也可以将main函数从NoCRTMain更改为WinMain,但随后需要安装C运行时或静态链接它。)



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

是。您使用的是完全相同的some命令,就像您通过命令行运行它一样(即java-jar YourJar.jar您的参数)@MadProgrammer:恐怕不再那么简单了。请看我的答案。我正在使用JavaSE7。我能在没有java.exe的情况下创建一个指向.jar的链接吗?@leolegas:一个指向jar文件的简单链接似乎在java 7和java 8中都能工作。我从未尝试过这样做,我不知道添加参数是否会像预期的那样起作用。