在Windows10中运行jar文件的问题 - java

我有一个Java项目,将其转换为jar文件。然后,我的C#项目正在将该jar文件与以下代码一起使用

proc = new Process();
            proc.StartInfo.WorkingDirectory = jarDir;
            Console.WriteLine("\nDirectory with jar file is\n" + jarDir);
            proc.StartInfo.FileName = jarName;
            Console.WriteLine("\npassed arguments are" + ifs_id.ToString() + " " + max_record.ToString() + " " + max_time.ToString() +
                " " + outputName + " " + outputDir);
            proc.StartInfo.Arguments = " " + ifs_id.ToString() + " " + max_record.ToString() + " " + max_time.ToString() +
                " " + outputName + " " + outputDir;
            proc.EnableRaisingEvents = true;
            proc.Exited += new EventHandler(OnProcessExit);
            proc.Start();

一切都在完美进行。
当我将项目转移到也可以在Windows10下运行的其他计算机时,问题就开始了。
这很有效。过程开始,并立即完成。
而且,我无法通过双击运行jar文件,我认为可能是这种情况。
在开发代码时,一切都可以完美运行。但是,当我将项目转换为.jar文件时,它将停止工作。

目录不是问题,我仔细检查了一下。

我不知道造成这种情况的原因。我会很感激任何建议。

参考方案

您的代码:proc.StartInfo.FileName = jarName;告诉Windows使用jar文件处理程序关联的任何文件运行.jar文件。与双击相同。

因此,这两种方法都不运行的事实意味着Windows上的Java运行时不是jarfile的注册处理程序。根据您安装的JRE风格,大多数Open JRE安装程序都不会这样做。我认为今年某个时候,AdoptOpenJDK已开始将jarfile处理选项包含到安装程序中。

选项1

修复jar文件关联。这应该可以使其在另一台计算机上运行,​​但是您需要在每台出现相同问题的其他计算机上都可以使用它。

从好的方面来说,这也将修复双击jar上的问题,而下面的选项2则不会这样做。

您可以选择以下几种方法:

使用适合您的JRE / JDK安装程序(例如AdoptOpenJDK的安装程序)。
手动执行。 This particular answer(不是标记为接受的那个)应该起作用。
如果您不反对在互联网上运行由随机陌生人制作的第三方工具,则jarfix将自动执行上述手动操作。

选项2

即使您的程序当前未与jarfile关联,也要使其触发Java。
这可能会使它在更多计算机上运行,​​但不会解决jar双击问题。

这要求Java已经安装并且位于操作系统的PATH中。要对此进行测试,请启动命令提示符,然后运行java -version。如果您得到回应,请继续阅读。否则,您需要查看如何在PATH中包含Java。

现在,在您的StartInfo中,您要直接调用java而不是jar文件:

proc.StartInfo.FileName = "java";

然后,将jar指定为参数的一部分:

proc.StartInfo.Arguments = " -jar " + jarName + " " + ...the rest of your args.

如果知道只能在Windows上运行,则可以将"java"替换为"javaw"

Java:javaagent无法访问tools.jar - java

我正在开发一个Java代理,它通过tools.jar之类的反射使用com.sun.tools.javac.util.Options中的某些类。为了测试我的代理,我要设置set JAVA_TOOL_OPTIONS=-javaagent:path-to-my-agent-jar并在将Java代理挂接到的简单gradle项目上启动构建。我已将tools.jar添加…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…