双击JAR文件无法打开命令提示符

6

我希望能够通过双击来运行一个Jar文件。

以下是唯一存在的Java类文件。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Sysout{
public static void main(String[] args) throws IOException{
    System.out.println("Hello World!");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String msg = br.readLine();
    System.out.println(msg);
    br.read();
}
}

并且清单文件中定义了Main-Class。

使用此链接,我成功地通过双击批处理文件运行了Jar文件。 这会打开命令提示符并运行定义的主类。

然而,如果我直接双击Jar文件,什么也不会发生。 我还检查了此链接并将我的.jar与javaw.exe关联起来。 此链接也建议如此。 还尝试将.jar与java.exe关联起来

问题是命令提示符只会打开一瞬间就消失了。

即使我期望用户输入一些数据,双击操作也不会等待用户输入任何内容。

问题出在哪里?


3
当你把 .jar 文件关联到 javaw 时,它故意不显示命令窗口!!将其关联到 java 上,你就应该能看到窗口了。 - Anya Shenanigans
@Petesh,您能将这个评论添加为答案吗?我相信您会得到回报的。 - adarshr
我已经与java.exe关联。然而,窗口只显示了一小部分时间。请参考更新的帖子。 - whitehat
3个回答

12
当您使用javaw关联时,它不会创建命令窗口,并且会吞掉所有的System.outSystem.err调用。
您应该重新将您的.jar文件与java二进制文件关联起来,这样应该会显示所需的命令窗口。
如果您使用简单的打开方式...选项,则会从命令行中省略-jar选项。
打开管理员命令窗口(如果您使用启用了UAC的Vista或Windows 7),然后执行以下操作:
assoc .jar=jarfileterm
ftype jarfileterm="C:\Program Files\Java\jre7\bin\java.exe" -jar "%1" %*
在你的情况下,你应该使用安装了jre的路径替换C:\Program Files\Java\jre7\bin\java.exe路径。
当你双击它时,它应该可以正确运行。
你可以添加另一个ftype:
ftype jarfile="C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %*

将路径中的javaw二进制文件替换为适用于您系统的文件。

现在,您可以通过交替选择assoc .jar=jarfiletermassoc .jar=jarfile来在窗口化和非窗口化之间切换。

如果您想在运行.jar后保留命令窗口,则可以使用cmd /s /k将java命令调用括起来,如下所示:

ftype jarfileterm=cmd /s /k ""C:\Program Files\Java\jre7\bin\java.exe" -jar "%1" %*"
assoc .jar=jarfileterm
如果这些命令有效,那么双击JAR文件将会弹出一个命令行窗口并保持打开状态。
无法使用“打开方式...”或“默认程序”设置足够复杂的命令行,以便允许JAR文件运行。如果你已经成功尝试了所有这些方法,例如ftype和assoc命令,但仍无法正常运行,则需要进入注册表编辑器。
启动regedit并搜索HKEY_CLASSES_ROOT下的名为.jar的键 - 这应该会产生一个名为(Default)的单个值,如果你的ftype命令调用已经起作用,则其值应为jarfileterm。如果没有效果,则可能是另一个应用程序创建的关联(我不知道Java更新程序是否替换这些条目,但如果是,则可能是问题所在)。
接下来需要在HKEY_CLASSES_ROOT中查找此键。它将找到此条目,其中应该包含一个名为Shell的键(即扩展文件夹jarfileterm,应该显示另一个文件夹Shell),其中包含一个名为Open的键,其中包含一个名为Command的键,该键包含一个(Default)值,其中应包含启动.JAR文件的调用命令。此命令应与您输入的最后一个ftype jarfileterm=...条目匹配。如果不匹配,则应使其与cmd /s /k或"c:\program files\java\jre7\bin\java.exe"选项之一匹配(具体取决于您是否要在启动时保持命令窗口)。

我将jar文件与jre/bin中的java.exe关联起来。然而,这会打开一个命令提示符窗口并在一秒钟后消失。我希望使用BufferedReader等待用户输入。因此,在消失之前应该等待用户输入一些内容。 - whitehat
如果你使用简单的“打开方式”选项,那么-jar选项将会缺失,导致你遇到的问题。我将在答案中更新一组可以从命令行使用的选项,以正确配置这个问题。 - Anya Shenanigans
感谢您更新答案。我按照解决方案设置了jarfileterm和jarfile,将.jar文件关联到jarfileterm。然而,这个解决方案并没有起作用:( 同样的问题仍然存在。命令提示符只显示了一小部分时间。 - whitehat
当你将相当于调用jarfileterm操作的内容复制到终端窗口时:"c:\program files\java\jre7\bin\java.exe" -jar "c:\users\my account\documents\myjar.jar",它是否能正确运行? - Anya Shenanigans
执行以下命令:ftype jarfileterm=cmd /s /k ""C:\Program Files\Java\jre7\bin\java.exe" -jar "%1" %*",然后执行 assoc .jar=jarfileterm,最后双击JAR文件即可。如果调用过程中出现任何错误,它们将会显示在终端窗口中。 - Anya Shenanigans
显示剩余2条评论

1

可能您的 .jar 文件已经与其他默认程序绑定了,右键单击并选择“Java(TM)平台SE二进制文件”进行打开。如果有可执行的 jar 文件,这应该可以解决问题。


0

我正在使用JDK在Windows 10中打开jar文件。

  1. 打开regedit → HKEY_CLASSES_ROOT\jarfile\shell\open\command
  2. 将默认设置从javaw更改为java

例如,我的设置是 "C:\Program Files\Java\jdk-14.0.1\bin\java.exe" "-jar" "%1"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接