在Openshift容器平台上执行.net core中的.jar文件

时间:2018-03-06 04:41:29

标签: jar .net-core openshift

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的任何替代方法。请帮忙。

1 个答案:

答案 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