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

在Openshift容器平台上执行.net内核中的.jar文件,jar,.net-core,openshift,Jar,.net Core,Openshift,net核心应用程序,它使用.net进程类在内部调用java.jar文件。我已经使用cmd.exe运行了.jar文件和参数。我已经在Openshift容器平台上部署了这个应用程序。但由于openshift在Linux上运行,因此cmd.exe不可用。 下面是.net内核中执行jar文件的代码 Process cmd = new Process(); cmd.StartInfo.UseShellExecute = false;

net核心应用程序,它使用.net进程类在内部调用java.jar文件。我已经使用cmd.exe运行了.jar文件和参数。我已经在Openshift容器平台上部署了这个应用程序。但由于openshift在Linux上运行,因此cmd.exe不可用。 下面是.net内核中执行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的任何替代方法。请帮助。

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不是必需的,因为.NETCore根本不在Linux上创建windows

如果没有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}\"";

哦,还要注意参数变量中的引用。如果用单引号将整个命令包装在-c之后,应该没问题,但是如果您正在做一些更复杂的事情-如果Common.JarFilePath不是一个简单的文件名-它可能不太好用。绝对测试和调整。也许可以考虑。

我找不到相对路径。我需要传递一个xml文件作为参数。但openshift表示xml文件不存在。。但它存在于git回购中。有什么想法吗?你能确认它是否存在于你正在运行的容器中吗?也许可以修改您的代码以打印您希望xml文件所在目录中的文件列表?