对 运行 个 jar 文件的实用建议

suggestion to run jar files in practical way

我有一个要 运行 的 jar 文件,但我想以更实用的方式 运行 而不提及 "java" 或 "java -cp blah blah"

目前,我需要 运行 我的 jar 文件使用“java -cp \MyProgram.jar [arguments]

但是,我不想 运行 我的程序使用这样的命令。我想我需要创建批处理文件或命令文件来调用我的 java 程序?或者还有其他更熟练的方法来 运行 jar 文件吗?

谢谢

编码良好的批处理文件是 运行 用户轻松 Java 应用程序的良好解决方案。

这是一个带有一些注释行的示例:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
title MyProgram
if "%~1" == "/?" goto ShowHelp

rem Try to find java.exe in current folder or any folder defined in
rem environment variable PATH as Windows command interpreter would do.

set "SearchPath=%CD%;%PATH%"
set "SearchPath=%SearchPath:)=^)%"
set "SearchPath=%SearchPath:\;=;%"
for /F "delims=" %%I in ('echo %SearchPath:;=^&ECHO %') do (
    if exist "%%~I\java.exe" (
        set "JavaPath=%%~I"
        goto RunMyProgram
    )
)

echo %~dpn0
echo.
echo Error: Failed to find java.exe in current folder or
echo        any folder defined in environment variable PATH.


:GetJavaPath
echo.
echo Please enter path to folder with java.exe.
echo.
echo Enter nothing to exit if Java is not installed at all.
echo.

set "JavaPath="
set /P "JavaPath=Path to java.exe: "

rem Has the user entered a folder path at all?
if "!JavaPath!" == "" goto BatchExit

rem Remove all double quotes from entered folder path.
set "JavaPath=!JavaPath:"=!"

rem Replace all / by \ in entered folder path.
set "JavaPath=!JavaPath:/=\!"

rem If there is a backslash at end, remove this backslash.
if "!JavaPath:~-1!" == "\" set "JavaPath=!JavaPath:~0,-1!"

rem Does java.exe exist in entered folder path?
if exist "!JavaPath!\java.exe" goto RunMyProgram

echo.
echo There is no java.exe in entered folder.
goto GetJavaPath


:ShowHelp
echo For using this application ...

echo.
pause
goto BatchExit


:RunMyProgram
echo.
"%JavaPath%\java.exe" -cp "%~dp0MyProgram.jar" %*


:BatchExit
endlocal

整个批处理代码使用由 setlocalendlocal 定义的自己的环境。阅读 change directory command cd ..not working in batch file after npm install 上的答案,详细了解这两个命令的作用。

第三行定义了控制台应用程序的标题,应将其编辑为您认为适合您的 Java 应用程序的任何内容。

在 Windows 上获取有关命令或控制台应用程序帮助的标准参数是 运行 使用 /? 作为参数。因此,批处理代码检查第一个参数是否等于 /?,在这种情况下,输出一个帮助,您必须在标签 ShowHelp.

下为您的应用程序编写

接下来,批处理文件会在当前目录和环境变量PATH 中定义的所有目录中搜索java.exe。预计可以自动找到 Java 可执行文件,因此您的 Java 应用程序接下来可以在没有任何用户交互的情况下执行。此代码部分是 Magoo in his answer on Find the path used by the command line when calling an executable.

编写的代码的略微修改版本

但如果无法自动找到java.exe,则输出带有完整路径的批处理文件的名称,让用户知道哪个应用程序正在打印错误消息,以及接下来的错误消息。

用户现在可以手动输入或通过将路径拖放到包含 java.exe.

的文件夹

只需按 RETURNENTER 用户就可以退出批处理文件,以防识别出 Java 根本没有安装,因此该用户无法使用您的 Java 应用程序。

否则可能会从输入的文件夹路径中删除双引号,正斜杠被反斜杠替换,因为许多用户在 Windows 上错误地使用 / 而不是 \,最后如果文件夹路径以反斜杠结尾,输入的文件夹路径的字符也会被删除。

下一步验证java.exe是否真的存在于用户输入的文件夹中

注意:如果用户输入例如"\",环境变量JavaPath在文件存在性检查时不再存在,但确实如此不是很重要。使用延迟扩展引用输入的文件夹路径,以防止由于语法错误退出批处理文件处理,以防用户在输入文件夹路径时输入错误,这将导致语法错误中的变量立即扩展。

此批处理文件预期 MyProgram.jar 与批处理文件本身位于同一目录中。 %~dp0 引用批处理文件的驱动器和路径。此字符串始终以反斜杠结尾,这就是 %~dp0MyProgram.jar.

之间没有反斜杠的原因

%~dp0MyProgram.jar 用双引号引起来,因为用户可能已将您的 Java 应用程序和批处理文件提取到名称或路径包含 1 个或更多空格的文件夹中。

%* 引用传递给批处理文件的所有参数(参数、选项),以将它们转发给您的 Java 应用程序。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /? ... 解释 %~1%~dp0%dpn0%*
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?
  • title /?