web-dev-qa-db-ja.com

javacを使用してJavaパッケージ構造をコンパイルする方法

(コマンドラインから)Java自分の別のパッケージをインポートするパッケージをコンパイルしようとしています。 tutorial online に従っていましたが、最終的なJavaファイル(CallPackage.Java)をコンパイルしようとするとエラーが発生します。

ファイル構造は次のとおりです。

+ test_directory (contains CallPackage.Java)
   -> importpackage
       -> subpackage (contains HelloWorld.Java)

CallPackage.Javaは次のとおりです。

/// CallPackage.Java
import importpackage.subpackage.*;
class CallPackage{
  public static void main(String[] args){
  HelloWorld h2=new HelloWorld();
  h2.show();
  }
}

helloWorld.Javaは次のとおりです。

///HelloWorld.Java

package importpackage.subpackage;

public class HelloWorld {
  public void show(){
  System.out.println("This is the function of the class HelloWorld!!");
  }
}

試みられたステップ

  1. サブパッケージに移動し、$javac HelloWorld.Javaを使用してHelloWorld.Javaをコンパイルします。
  2. Test_directoryに移動し、$javac CallPackage.Javaを使用してCallPackage.Javaをコンパイルします。

これにより、最後のコマンドでエラーが発生します。

CallPackage.Java:1: package importpackage.subpackage does not exist
import importpackage.subpackage.*;
^
CallPackage.Java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
  ^
CallPackage.Java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
                    ^
3 errors

両方のパッケージをコンパイルするにはどうすればよいですか?助けてくれてありがとう!

14
Pswiss87

Importpackage/subpackageがクラスパスに含まれていますか?

-cp pathまたは-classpath path

ユーザークラスファイル、および(オプションで)注釈プロセッサとソースファイルの場所を指定します。このクラスパスは、CLASSPATH環境変数のユーザークラスパスをオーバーライドします。 CLASSPATH、-cp、-classpathのいずれも指定されていない場合、ユーザークラスパスは現在のディレクトリで構成されます。詳細については、クラスパスの設定を参照してください。

-sourcepathオプションが指定されていない場合、ソースファイルのユーザークラスパスも検索されます。

-processorpathオプションが指定されていない場合、アノテーションプロセッサのクラスパスも検索されます。

http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/javac.html

3
Jazzy Josh

問題は、コマンド(javacおよびJava)ごとにクラスパスを設定する必要があることです。

試みられたステップ

  1. サブパッケージに移動する代わりに、top_levelからHelloWorld.Javaをコンパイルします。

    $javac -cp . importpackage/subpackage/HelloWorld.Java

  2. 同じ方法でCallPackage.Javaをコンパイルします。

    $javac -cp . CallPackage.Java

  3. クラスパスを使用してファイルを実行する:

    $Java -cp . CallPackage

[〜#〜] note [〜#〜]:「$ Java CallPackage」を実行すると、「エラー:メインクラスCallPackageが見つからないか、ロードできません」というエラーが表示されます。

要約すると、各ステップ中に、クラスパスを指定する必要があります。このように実行した後、機能しました。

11
Pswiss87

私と同じ状況。そして、クラスを同時にコンパイルすることでそれを引き継ぐようになりました。
たとえば、私のプロジェクトは次のとおりです。

+ beerV1
   -> classes
   -> src
         -> com
              -> example
                   -> model
                        -> BeerExpert.Java
                   -> web
                        -> BeerSelect.Java


BeerExpert.Java:

package com.example.model;
import ...

public class BeerExpert{
    ...
}


BeerSelect.Java:

package com.example.web;
import com.example.model.*;
import ...

public class BeerSelect {
      ...
}


ご覧のとおり:BeerSelect.Javaはクラスをインポートしようとしています com.example.model パッケージ。
初めてコマンドでBeerExert.Javaをコンパイルしました:

--> javac -d classes src/com/example/model/BeerExpert.Java

その後:
--> javac -d classes src/com/example/web/BeerSelect.Java

そして結果は:
-->... error: package com.example.model does not exist

したがって、この場合、複数のクラスseparatelyをコンパイルしても機能しないことはわかっていました。


グーグルで苦しんだ後、私はこの問題を解決する非常に簡単な方法を見つけました:
一度にすべてコンパイルします。

--> javac -d classes src/com/example/model/BeerExpert.Java src/com/example/web/BeerSelect.Java 


最後に、私が得たものは次のとおりです。

 + beerV1
           -> classes
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.class
                           -> web
                                -> BeerSelect.class
           -> src
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.Java
                           -> web
                                -> BeerSelect.Java

お役に立てば幸いです。

1

(1)最初にコードをコンパイルする

javac -d importpackage.subpackage.HelloWorld

(2)次にCallPackage.Javaをコンパイルします

javac CallPackage.Java

0
Dev