21782


javaでpackege文を用いて、別クラスからメソッドを呼び出すコードを書いていたのですがうまく行きません  
**`Test.java`** :

[code]

    package test.pack;
    public class Test{
        public static void main(String [] args){
            String text1="これは別クラスでのメソッド";
            String text2="の呼び出しのテストです。";
            String testing=test2.pack.Test2.test_in(text1,text2);
        }
    }
    
[/code]

[code]

    エラー内容
    javac "Test.java"
    Test.java:6: エラー: パッケージtest2.packは存在しません
            String testing=test2.pack.Test2.test_in(text1,text2);
                                     ^
    エラー1個
    コンパイル失敗
    
[/code]

**`Test2.java`** :

[code]

    package test2.pack;
    public class Test2{
        public static void main(String [] args){
    
        }
    
        public static String test_in(String a,String b){
            System.out.print(a);
            System.out.print(b);
            String ret="";
            return ret;
        }
    }
    
[/code]

エラー無し

どうすれば改善されますでしょうか？


CC BY-SA 3.0
2016-02-02T12:06:58.623
21630
2016-02-06T13:07:35.127
2016-02-03T01:13:12.003
2808
question
java
javaでpackege文で別クラスからメソッドを呼び出すコードでエラー


`javac`コマンドのオンラインドキュメントはこちらになります。

  * [javac - Java Platform, Standard Editionツール・リファレンス](http://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javac.html)

このドキュメントのうち、「[
**型の検索**](http://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javac.html#BHCJJJAJ)」という節が今回関係する箇所です。

>
> コンパイラは、ソース・ファイルで使われているクラスまたはインタフェース、拡張されているクラスまたはインタフェース、あるいは実装されているクラスまたはインタフェースすべてについて、型の情報を必要とします。

今回の場合、`javac
Test.java`コマンドを実行した際に、`Test.java`内で使用されている`test2.pack.Test2`の情報がわからないのでエラーになっています。  
逆に言うとコンパイラに型情報を教えてあげれば解決する、ということですね。

* * *

いくつか解決手段があり、いずれも上記で引用した箇所の後続文章を読むとわかると思います。

最も一般的なのは、

[code]

    .
    ├── test
    │   └── pack
    │       └── Test.java
    └── test2
        └── pack
            └── Test2.java
    
[/code]

というディレクトリ構造になっていると思いますので、このディレクトリで次のコマンドを実行することです。  
`javac test/pack/Test.java`

上記コマンドを該当ディレクトリで実行した場合、コンパイラは`test2.pack.Test2`クラスの型情報を`test2/pack/Test2.java`ソースファイルから得ることができますのでコンパイルが成功します。

>
> コンパイラは、型の情報が必要になると、その型を定義しているソース・ファイルまたはクラス・ファイルを探します。まず、ブートストラップ・クラスと拡張機能クラスを検索し、続いて
> **ユーザー・クラス・パス(デフォルトではカレント・ディレクトリ)を検索します**
> 。ユーザー・クラス・パスは、CLASSPATH環境変数を設定するか、または-classpathオプションを使用して定義します。
>
> -sourcepathオプションを設定した場合、コンパイラは指定したパスでソース・ファイルを検索します。
> **そうでない場合、コンパイラは、ユーザー・クラス・パスでクラス・ファイルとソース・コード・ファイルの両方を検索します** 。

* * *

上記のような一般的なソースファイルの保存方法ではなく、

[code]

    .
    ├── Test.java
    └── Test2.java
    
[/code]

のように`Test.java`, `Test2.java`の2ファイルが同じディレクトリに置かれているのであれば

`javac Test.java Test2.java`

でもコンパイルすることは可能です。質問文中の実行コマンドとは異なり、コンパイラはクラスパス(ソースパス)を探索せずとも必要な型情報を得られるためです。

ただし実行時クラスパスのことを考えると、通常は出力先を明示して  
`javac -d . Test.java Test2.java`  
のような形になるでしょう。  
(なお繰り返しになりますが、このようなファイルの置き方はJavaでは一般的ではありません。)

* * *

(以下、コメントの内容を反映)

コメントに書かれたディレクトリ構成であれば、`/home/tomo/JAVA/`
をソースパス(クラスパス)に設定することで`test.pack.Test`クラス, `test2.pack.Test2`クラス両方の型情報が得られます。

ソースパス(クラスパス)の指定方法は前述「型の検索」を参照していただきたいのですが、分かりやすいのは`CLASSPATH`環境変数も`-cp`オプションも付けない状態のデフォルト、すなわちカレントディレクトリがクラスパスになる状態でコンパイルすることです。

[code]

    $ cd /home/tomo/JAVA/
    $ javac test/pack/Test.java
    
[/code]

このとき、カレントディレクトリの`/home/tomo/JAVA/`がクラスパスになります。

明示的にクラスパスを指定するのであれば、任意のディレクトリで`javac`コマンドを実行することもできます。

[code]

    $ javac -cp /home/tomo/JAVA/ /home/tomo/JAVA/test/pack/Test.java
    
[/code]


CC BY-SA 3.0
2016-02-03T02:15:17.970
21646
2016-02-03T12:40:48.263
2016-02-03T12:40:48.263
2808
2808
21630
answer


解説は既にされているので具体的な手順だけ

次の様なフォルダに提示されたソースファイルがある。

[code]

    /home/tomo/JAVA/test2/pack/Test2.java
    /home/tomo/JAVA/test/pack/Test.java 
    
[/code]

(1)`Test.java`のあるフォルダに移動。

[code]

    cd /home/tomo/JAVA/test/pack/
    
[/code]

(2) `Test.java`のコンパイル

[code]

    javac -cp /home/tomo/JAVA Test.java
    
[/code]

`Test2.java`がコンパイルされていない場合同時にコンパイルされる。

(3) `JAVA`フォルダに移動

[code]

    cd ../..
    
[/code]

(4) `Test.class`の実行

[code]

     java test.pack.Test
    
[/code]


CC BY-SA 3.0
2016-02-06T13:07:35.127
21782
2016-02-06T13:07:35.127
5044
21630
answer