26746

[code]

    myproject/
       |- Main.java
       |- a/
          |- A.java
       |- b/
          |- B.java
          |- hoge/
              |- Hoge.java
    
    各クラスのパッケージ
    Main.java (package myproject)
    A.java    (package myproject.a)
    B.java    (package myproject.b)
    Hoge.java (package myproject.b.hoge)
    
[/code]

Main.javaは、A.javaとB.javaとHoge.javaを使用しています。  
このような階層構造の場合のクラスパスの指定の仕方がわからずこまっています。

以下のように試してみましたがうまくいきませんでした。

[code]

    javac -cp .:a/*.java:b/*.java:b/hoge/*.java Main.java
    
[/code]

* * *

追記

以下のようなコンパイルエラーが起こります。

[code]

    Main.java:3: エラー: パッケージmyproject.aは存在しません
    import myproject.a.*;
    ^
    
[/code]

ほか、`myproject.b`や`myproject.b.hoge`も存在しませんと出ます。


CC BY-SA 3.0
2016-06-14T07:46:33.407
26740
2016-06-14T09:44:14.260
2016-06-14T09:44:14.260
13404
13404
question
java
クラスパスが通らなくて困っています


> 各クラスのパッケージ  
>  Main.java (package project)

の`project`は、`myproject`に置き換えて以下、回答します。

### クラス・パスのワイルドカード

クラスパスに`.java`ファイルを指定する必要はありません。  
またワイルドカード`*`は、[クラス・パスのワイルドカード -
クラス・パスの設定](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/classpath.html#A1100762)にあるように、ディレクトリ内のすべての`JAR`ファイルを指定する場合に使用可能です。

### 型の検索

[code]

    javac -cp .:a/*.java:b/*.java:b/hoge/*.java Main.java
    
[/code]

[code]

    Main.java:3: エラー: パッケージmyproject.aは存在しません
    
[/code]

とエラーになっているので、例えばカレントディレクトリが`/tmp/myproject`の場合、`/tmp/myproject/myproject/a/A.java`などが見つけられない状態だと考えられます。

すでに @harry0000 さんがコメントしているように、[java - javaでpackege文で別クラスからメソッドを呼び出すコードでエラー -
スタック・オーバーフロー](https://ja.stackoverflow.com/questions/21630/java%e3%81%a7packege%e6%96%87%e3%81%a7%e5%88%a5%e3%82%af%e3%83%a9%e3%82%b9%e3%81%8b%e3%82%89%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99%e3%82%b3%e3%83%bc%e3%83%89%e3%81%a7%e3%82%a8%e3%83%a9%e3%83%bc)でも同じ回答が述べられていますが、コンパイラはソースファイル(パッケージ)などを以下の記述のように検索します。

[型の検索 -
javac](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/javac.html#BHCJJJAJ)

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

このため、カレントディレクトリを以下のように変更してコンパイルする:

[code]

    > pwd
    > /tmp/myproject
    > cd ..
    > ls
    > myproject/
    > javac -cp . myproject/Main.java
    
[/code]

または、クラスパスに親ディレクトリを指定する:

[code]

    > pwd
    > /tmp/myproject
    > javac -cp .. Main.java
    
[/code]

などで回避できると思われます。


CC BY-SA 3.0
2016-06-14T09:36:31.637
26746
2016-06-14T09:36:31.637
2017-04-13T12:52:39.113
-1
46
26740
answer