繁体   English   中英

Java 未被识别为 eclipse 的内部或外部命令,但在 cmd 中运行良好

[英]Java is not recognized as an internal or external command for eclipse but works well from cmd

我正在从 cmd 运行在 eclipse(在 java 中)下开发的 sw。 它运作良好。 一旦我想从

我正在向另一个 java 程序 (A) 添加一个可运行的 java sw (B.jar)。 B.jar 的“调用”在 cmd 上运行良好,并且工作正常。 一旦从程序(A)中调用,它就会给我“无法识别的命令”的错误。 我从 eclipse 执行程序 (A)。 我们是否需要在 Eclipse 中配置一些附加信息? 或者也许让我直接从软件的分发中执行 (A)

从 cmd 执行的屏幕截图: 在此处输入图像描述

eclipse 的执行截图: 在此处输入图像描述

2020-06-24 12:57:26,172 [Thread-7] INFO - 'java' n'est pas reconnu en tant que commande interne 2020-06-24 12:57:26,173 [Thread-7] INFO - ou externe, un program ex‚cutable ou un fichier de commandes。 2020-06-24 12:57:36,141 [Thread-6] INFO - Appuyez sur une touche pour continuer...

从 (A) 到调用 (B) 的脚本:

private final InputStream inputStream;

class Flux implements Runnable {

    private final InputStream inputStream;

    Flux(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    private BufferedReader getBufferedReader(InputStream instream) {
        return new BufferedReader(new InputStreamReader(instream));

    }

    public void run() {
        BufferedReader br = getBufferedReader(inputStream);
        String line = "";
        try {
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

String command =  B_SW_AbsolutePath + " "+ usersCommand;
try {
            Runtime rt = Runtime.getRuntime();
            this.proc = rt.exec(command, {""}, outputDir);
            Trace.info("execution "+command+" "+outputDir.toString());
            
            Flux outputStream = new Flux(
                    this.proc.getInputStream());
            Flux errorStream = new Flux(
                    this.proc.getErrorStream());
            new Thread(outputStream).start();
            new Thread(errorStream).start();
            this.proc.waitFor(10,TimeUnit.SECONDS);
        } catch (IOException e) {
            Trace.erreur("External software can not be run " + e.getMessage());
        }
        
        finally{
            
            this.process.destroy(); 
        }
    }

非常感谢你的帮助

通过使用带有{""} for envp 的Runtime.exec(String cmd,String[] envp,File dir)重载,您为子进程提供了没有环境变量,特别是没有 PATH envvar,相当于一个空的。 由于您的批处理文件显然运行一个简单的程序名称java而不是完整的路径名,因此需要在 PATH 变量中查找它,并且由于 PATH 变量为空,因此查找失败。 如果您不想或不能更改批处理文件以指定所有内容的完整路径(否则不依赖于任何环境变量)——并且如果需要类似地更改它运行的所有内容——最好的解决方案是null传递给exec的第二个 (envp) 参数,因此它使用默认值,即父 Java 自己的 envvars。 更难的方法是手动构建正确 envvars(带有值)的列表,然后传递它。

此外,您可以将String[]重载与new String[]{"script","command"}一起使用,而不是连接Runtime.exec必须重新拆分的"script"+" "+"argument" 根据编译器,您可能不需要new String[] 我没有跟踪所有类型推断的更改,因为我通常更喜欢明确。 但是,既然您想要跟踪的组合,也许不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM