【问题标题】:Error when trying to execute a command in java [duplicate]尝试在java中执行命令时出错[重复]
【发布时间】:2013-06-12 16:05:53
【问题描述】:

我正在尝试使用终端但从 java 运行 java 文件。意思是,我将使用 java 运行命令。 我正在尝试执行重定向到以下目录的命令“cd /Users/apple/Documents/Documents/workspace/UserTesting/src”,然后执行列出当前目录中所有文件的命令“ls”

我正在使用这种方法来运行Java文件'NewFile.java'

 try {
           String line;
           Process p = Runtime.getRuntime().exec( "cd /Users/apple/Documents/Documents/workspace/UserTesting/src" );
           Process p2 = Runtime.getRuntime().exec( "ls" );

           BufferedReader in = new BufferedReader(
                   new InputStreamReader(p2.getInputStream()) );
           while ((line = in.readLine()) != null) {
             System.out.println(line);
           }
           in.close();

     }
     catch (Exception e) {
           // ...
         }

输出

直接使用终端->它给出'NewFile.java'

在 Java 中使用这个方法 -> 对于 p2 的任何命令,它总是给出 'bin' 和 'src'

这里有几个试验

Apples-MacBook-Pro:~ apple$ cd /Users/apple/Documents/Documents/workspace/UserTesting/src Apples-MacBook-Pro:src apple$ java NewFile 5 90 35 45 150 3
Reichweite----nach blase art
3 5 35 45 90 150

Apples-MacBook-Pro:src apple$ java /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile 线程“主”java.lang.NoClassDefFoundError 中的异常: /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile 引起:java.lang.ClassNotFoundException: .Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile 在 java.net.URLClassLoader$1.run(URLClassLoader.java:202) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Apples-MacBook-Pro:src apple$ java /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile.java 线程“主”java.lang.NoClassDefFoundError 中的异常: /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile/java 引起:java.lang.ClassNotFoundException: .Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile.java 在 java.net.URLClassLoader$1.run(URLClassLoader.java:202) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:247) Apples-MacBook-Pro:src 苹果$ 块引用

【问题讨论】:

  • 太难理解你的问题了。你需要做得更好
  • 这里有一个更好的解释@JunedAhsan
  • @BrianRoach 不同的是,这里我想使用我们在终端中使用的命令从java内部运行一个Java文件
  • 该问题的答案解释了这一点。您的进程不是终端。您不能通过执行外部进程来更改工作目录。这就是忽略 exec'ing ls 而不是简单地读取目录首先是相当愚蠢的。
  • 你的问题没有多大意义。如果要执行 java 文件,为什么要使用 cd/ls?为什么不只是java /path/to/file.class?而且这个程序甚至不应该正确运行(cd 不是一个应用程序),所以它根本不应该打印任何东西。

标签: java terminal runtime execution


【解决方案1】:

因此,您遇到的问题似乎是您不明白为什么以不同方式调用程序时会得到不同的结果。

这是怎么回事:Runtime.geRuntime().exec() 创建一个新进程,它是父进程的子进程。每个进程都有自己的工作目录;当你 fork 一个新进程时,它会继承父进程的工作目录。然后调用cd 将更改当前进程的工作目录(这是一个内置的shell,但现在忽略它,稍后我会谈到它)。

所以你正在做的是:

父母

-> 创建子 1 -> 更改子 1 的工作目录

-> 创建子 2 -> 调用“ls”

请注意,子 2 将继承其父的工作目录。它对子 1 的工作目录一无所知。因此,取决于调用此方法的进程的工作目录(在您的情况下,终端或...我不知道,您的 JDK 安装? ) 你会得到不同的结果。

如果您每次都想要相同的结果,您可以这样做:

Process p = Runtime.getRuntime().exec( "ls /Users/apple/Documents/Documents/workspace/UserTesting/src" );

如果您希望能够从任何地方执行您的程序,只需使用完整路径:

Process p = Runtime.getRuntime().exec( "java /Users/apple/Documents/Documents/workspace/UserTesting/NewFile" );

(当然,假设您已经使用javac 在该目录中构建了NewFile.class,并且您拥有执行它的正确权限。)

回复:cd,正如我之前提到的,这是一个内置在你的 shell 中的命令。当您以这种方式使用exec 调用命令时,它可能会失败。您可以通过使用ProcessgetErrorStream() 方法读取标准错误来检查。

【讨论】:

  • 我只是用ls来测试..我想用这个方法运行java文件'NewFile'
  • 文件的完整路径是/Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile.java
  • 您看到我建议的更改了吗?与您可以将完整(而不是相对)路径传递给ls 的方式相同,您也可以将完整路径传递给 exec。编辑了我的答案以提供代码。
  • 请检查我的问题@danben 中更新的几个试验
  • 我的意思是,现在您只是将不相关的错误粘贴到您的问题中。我回答了你最初问的问题。
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2021-03-02
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多