-1

ターミナルを使用して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 at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at 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 at 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) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Apples-MacBook-Pro:src apple$ Blockquote

4

1 に答える 1

1

したがって、プログラムをさまざまな方法で呼び出すと、なぜ異なる結果が得られるのか理解できないという問題があるようです。

何が起こっているかは次のとおり Runtime.geRuntime().exec()です。親の子である新しいプロセスを作成します。すべてのプロセスには独自の作業ディレクトリがあります。新しいプロセスをフォークすると、親の作業ディレクトリが継承されます。呼び出すcdと、現在のプロセスの作業ディレクトリが変更されます(これはシェルの組み込みですが、今は無視してください。後で説明します)。

だからあなたがやっていることはこれです:

-> 子 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に既に使用しており、それを実行するための適切な権限があることが前提です。)

Re:cd前に述べたように、これはシェルに組み込まれているコマンドです。この方法でコマンドを呼び出すと、exec失敗する可能性があります。getErrorStream()のメソッドを使用して標準エラーを読み取ることで、それを確認できますProcess

于 2013-06-16T16:05:37.373 に答える