net core应用程序,它使用.net Process类在内部调用java(.jar)文件。我使用cmd.exe运行.jar文件和参数。我已经在Openshift Container Platform上部署了这个应用程序。但由于openshift在Linux上运行,因此cmd.exe不可用。 下面是.net core中用于执行jar文件的代码。
Process cmd = new Process();
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.WorkingDirectory = Common.JarWorkingDir;
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.Arguments = "/K java -jar " + string.Format("{0} {1}", '"' + Common.JarFilePath + '"', '"' + sourceCodePath + '"');
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.Start();
cmd.StandardInput.WriteLine("exit");
cmd.StandardInput.Flush();
cmd.WaitForExit();
所以Jar文件无法执行。在OpenShift上使用.net执行此jar的任何替代方法。请帮忙。
答案 0 :(得分:1)
OpenShift本质上是运行Linux容器的Kubernetes。换句话说,您的代码应该像在Linux上运行一样。
而不是cmd.exe
,使用bash
(或sh
,或者实际上,无论您的容器中预先安装了哪个shell):
Process cmd = new Process();
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.WorkingDirectory = Common.JarWorkingDir;
cmd.StartInfo.FileName = "bash";
cmd.StartInfo.Arguments = "-c 'java -jar " + string.Format("{0} {1}", '"' + Common.JarFilePath + '"', '"' + sourceCodePath + '"'');
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.Start();
cmd.StandardInput.WriteLine("exit");
cmd.StandardInput.Flush();
cmd.WaitForExit();
你甚至可以删除一些行。例如,CreateNoWindow不是必需的,因为.NET Core根本不会在Linux上创建窗口。
如果你没有shell表达式,也许你甚至可以简化并简化:
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.FileName = "bash";
cmd.StartInfo.Arguments = "-c 'java -jar " + string.Format("{0} {1}", '"' + Common.JarFilePath + '"', '"' + sourceCodePath + '"'');
这样的事情:
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.FileName = "java";
cmd.StartInfo.Arguments = $"-jar \"{Common.JarFilePath}\" \"{sourceCodePath}\"";
哦,请注意Arguments
变量中的引用。如果你在-c
之后用单引号包装整个命令,你应该没问题,但如果你做的事情比较棘手 - 如果Common.JarFilePath
不是一个简单的文件名 - 它可能效果不好。绝对测试和调整。也许考虑EscapeAndConcatenate
。