54407


Eclipseで作成したプログラムがターミナルで実行できません。

Eclipse上では正常に作動するのですが、ターミナルで実行した場合、コンパイルまではうまくいくのですが、以下のようなメッセージが表示されます。

**ターミナルからの実行時に表示されるメッセージ**

[![画像の説明をここに入力](https://i.stack.imgur.com/zn23k.png)](https://i.stack.imgur.com/zn23k.png)

[code]

    package lesson02;
    import java.net.*;
    import java.io.*;
    
    public class Fetcher {
        public static void main(String[] args) throws IOException {
                try{
                     URL url = new URL("http://www.hogehoge.ac.jp");
                     //URLは仮名で書いてます!!!!
                     URLConnection connection = url.openConnection();
                     InputStream in = connection.getInputStream();
                     File file = new File("/Users/takatsuka/Fetcher/2.html");
                     FileOutputStream out = new FileOutputStream(file,false);
                     int b;
                     while((b = in.read()) != -1){
                        out.write(b);
                     }
                     out.close();
                }
                catch (Exception e)
                {
                System.out.println(e.toString());
                }
        }
    
    }
    
[/code]


CC BY-SA 4.0
2019-04-23T01:30:14.927
54405
2019-04-26T22:30:54.870
2019-04-24T07:21:34.883
3060
question
java
Javaプログラムがターミナルから実行できない


以下の行を削除するか、

[code]

    package lesson02;
    
[/code]

ディレクトリ`lesson02`を作成して、そこに`Fetcher.java`を移動してからコンパイル・実行してみてください。

[code]

    $ javac lesson02/Fetcher.java
    $ java lesson02.Fetcher
    
[/code]

Javaの「package」について少し調べた方がいいと思います。


CC BY-SA 4.0
2019-04-23T01:54:35.077
54407
2019-04-23T01:54:35.077
21092
54405
answer


`javac`コマンドの形式は次の通りで、指定するのは **ファイル名** です。  
<https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/javac.html>

[code]

    javac [ options ] [ sourcefiles ] [ classes] [ @argfiles ]
    
[/code]

> sourcefiles  
>  コンパイルされる1つ以上のソース・ファイル(MyClass.java など)。

他方、`java`コマンドの形式は次の通りで、指定するのは **クラス名** です。  
<https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html>

[code]

    java [options] classname [args]
    
[/code]

> classname  
>  起動するクラスの名前。

リファレンスに「classname(クラスの名前)」の説明がこれ以上書かれていないのですが、質問文で指定されている `Fetcher` というのは
**simple name** と呼ばれるもので、 **class name** というのはパッケージ名も含めた `lesson02.Fetcher`
になります(ただ、 `Fetcher` を指して **class name** と呼ぶことも頻繁にあるので、たしかに混乱します…)。

次に、`javac`でコンパイルした結果生成される `.class` ファイルはパッケージ名を反映したディレクトリに置く必要があります(注)。  
今回対象としているクラス `lesson02.Fetcher` について言うと、 `Fetcher.class` は
`<classpath>/lesson02/` ディレクトリの直下になければなりません。

ここで classpath とは、 `java`コマンドの引数 `-cp` や環境変数 `CLASSPATH`
で指定されたパスのことで、未指定の場合はカレントディレクトリが classpath になります。  
今回は未指定なので、 `./lesson02/Fetcher.class` となります。

まとめると:

  * (classpath をカレントディレクトリとするので)ファイルを `./lesson02/Fetcher.class` に置く
  * 次の引数を伴って`java`コマンドを実行する: `java lesson02.Fetcher`

(注: 主要な実装ではそうしている、というだけで、Java
仕様で決まっているわけではないようです。全てのファイルシステムがツリー構造になっているわけではない、とかいう理由が思い浮かびました。)

* * *

実際には、`javac`でコンパイルした後 `.class`
を移動させるよりは`javac`コマンド実行時にクラス名に沿った形でファイルシステムへ出力しておくことが大半です(Maven や Gralde
といったビルドツールを使った場合は自動でそうなります)。  
`javac`を直接実行する場合には、 `-d <出力先ディレクトリ>` オプションが使えます。例えばカレントディレクトリを出力先に指定したい場合は:

[code]

    javac -d . Fetcher.java
    
[/code]

結果、ディレクトリ構造は次のようになるので、このまま `java lesson02.Fetcher` と打てば実行できます。

[code]

    .
    ├── Fetcher.java
    └── lesson02
        └── Fetcher.class
    
[/code]

(もう少し言うと、`.java` ファイルが置かれている場所で
`javac`コマンドを実行することも一般的ではありませんが、本筋から逸れるのでこれ以上は省略します。)

* * *

また、`java`コマンド実行に際しても、必ずしもカレントディレクトリから見て `./lesson02/Fetcher.class`
が存在している必要はありません。必要なのはclasspathが適切に設定されていることです。

例えば、

[code]

    /home/nyname/java/lesson02/Fetcher.class
    
[/code]

にファイルが存在するとした場合、`-cp <クラスパス>` オプションを付与して

[code]

    java -cp /home/nyname/java lesson02.Fetcher
    
[/code]

とすれば、カレントディレクトリがどこであれ実行可能です。

* * *

補足:  
Java11 以降なら source-file mode を利用した次のコマンドで実行可能です。  
`java`コマンドに **ファイル名** を指定します。

[code]

    java Fetcher.java
    
[/code]

* * *

参考:

  * [`javac`コマンドリファレンス(Java8)](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/javac.html)
  * [`java`コマンドリファレンス(Java8)](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html)
  * [`java`コマンドリファレンス(Java11)](https://docs.oracle.com/en/java/javase/11/tools/java.html)
  * [Managing Source and Class Files - The Java™ Tutorials](https://docs.oracle.com/javase/tutorial/java/package/managingfiles.html)


CC BY-SA 4.0
2019-04-23T16:03:26.583
54441
2019-04-26T22:30:54.870
2019-04-26T22:30:54.870
2808
2808
54405
answer