web-dev-qa-db-ja.com

Java-インポートが機能しないパッケージのヘルプ

私はC++開発者です-Java開発者ではありませんが、このコードを機能させる必要があります...

別の製品で使用される2つのパブリッククラスがあります。各Javaファイルでpackageディレクティブを使用しました。

package com.company.thing;

class MyClass ...

追加するテストアプリをコンパイルしようとすると

import com.company.thing.*;

Javacコンパイラは、com.companyが存在しないというエラーで失敗します。 (パッケージを作成したばかりのクラスファイルと同じディレクトリでコンパイルしても)

私は骨の折れる愚かなことをしていると確信しています。

http://Java.Sun.com/docs/books/tutorial/Java/package/usepkgs.html ページを読んで、/ com/company /のようなディレクトリ構造を設定しようとしました事などが、私は完全にそれをすべて台無しにしたか、何か他のものが不足しています。

提案に感謝します-以前にクラスパスを試しました。助けにはなりません。

コンパイルしてみた

javac -classpath <parent> client.Java 

結果は次のとおりです。

package com.company does not exist

\ com\company\productにインポートしたいコード(2つのJavaファイル)があります。それらをコンパイルします。(MyClassが含まれています)それらのjarファイルも作成しました。 jarファイルを親ディレクトリにコピーしました。

その後、クライアントとの親ディレクトリでJavaファイル)

javac -cp <jarfile> *.Java

結果は次のとおりです。

cannot access MyClass
bad class file: MyClass.class(:MyClass.class)
class file contains wrong class: com.company.product.MyClass
Please remove or make sure it appears in the correct subdirectory of the classpath.

編集

MyClassの完全修飾名を使用して親ディレクトリでコンパイルした場合、クライアントコードをコンパイルして実行できます。私は今完全に混乱しています。

クラスパスを設定せずにコンパイル-ちょうど

javac *.Java 

親ディレクトリで-それはうまく機能しました。

コンパイルするテストアプリを入手することはできますが、実稼働コードに統合する必要がある場合、それはカットされません。まだ助けを探しています。

編集:

最後に-以前はなぜ機能しなかったのかはわかりませんが、ディレクトリ構造全体のすべてのファイルをクリーンアップしましたが、現在は機能しています。

ありがとう

29
Tim

さて、すでに投稿されたものを明確にするために。

ディレクトリcomが含まれ、ディレクトリcompanyが含まれ、ディレクトリexampleが含まれ、ファイルMyClass.Javaが含まれている必要があります。

comを含むフォルダーから、次を実行します。

 $ javac com\company\example\MyClass.Java 

次に:

 $ Java com.company.example.MyClass 
 Hello from MyClass!

これらは両方ともソースツリーのルートから実行する必要があります。そうしないと、javacJavaは他のパッケージを見つけることができません(実際、JavaMyClassを実行することさえできません)。

短い例

フォルダー「testpackage」と「testpackage2」を作成しました。テストパッケージ内で、次のコードを含むTestPackageClass.Javaを作成しました。

package testpackage;

import testpackage2.MyClass;

public class TestPackageClass {
    public static void main(String[] args) {
        System.out.println("Hello from testpackage.TestPackageClass!");
        System.out.println("Now accessing " + MyClass.NAME);
    }
}

Testpackage2内で、次のコードを含むMyClass.Javaを作成しました。

package testpackage2;
public class MyClass {
    public static String NAME = "testpackage2.MyClass";
}

2つの新しいフォルダーを含むディレクトリから、次を実行しました。

 C:\ examples> javac testpackage\*。Java 
 
 C:\ examples> javac testpackage2\*。Java 

次に:

 C:\ examples> Java testpackage.TestPackageClass 
 Hello from testpackage.TestPackageClass!
今すぐtestpackage2.MyClass 
にアクセスしています

それは物事をより明確にしますか?

47
Michael Myers

はい、これはクラスパスの問題です。 .classファイルが存在するディレクトリがCLASSPATHの一部であることをコンパイラとランタイムに伝える必要があります。追加する必要があるディレクトリは、パッケージ構造の先頭にある「com」ディレクトリの親です。

これを行うには、javac.exeとJava.exeの両方に-classpath引数を使用します。

また、使用しているサードパーティのクラスがどのようにパッケージ化されているかも尋ねる必要があります。それらがJARにあり、それらを1つに含めることをお勧めする場合は、.jarファイルをクラスパスに追加します。

Java -classpath .;company.jar foo.bar.baz.YourClass

「Javaクラスパス」のGoogle。 this のようなリンクがあります。

もう1つ、「インポート」はクラスをロードしていません。入力するだけで済みます。 importステートメントを含める場合、コードで完全に解決されたクラス名を使用する必要はありません-「com.company.thing.Foo」の代わりに「Foo」と入力できます。それだけです。

10
duffymo

あなたのディレクトリ構造は正しい方向に向かっているようです。依存コードをコンパイルするとき、javac-classpath引数を指定します。 comディレクトリのparentディレクトリを使用します。ここで、comにはcompany/thing/YourClass.classが含まれます

5
erickson

あなたはたくさんの良い答えを得たので、私はただ提案を捨てます。このプロジェクトで2日間以上作業する場合は、Eclipseまたはnetbeansをダウンロードして、そこにプロジェクトをビルドします。

通常、Javaプログラマーではない場合、それが提供するヘルプは非常に貴重です。

2時間しか費やしていない場合、1/2時間のダウンロード/インストールの価値はありません。

どちらにも「インポートを修正」するホットキー/メニュー項目があります。これにより、インポートを再度心配する必要がなくなります。

5
Bill K

標準のJavaクラスローダーはディレクトリ構造のステッカーです。クラスパスの各エントリはディレクトリまたはjarファイル(または実際にはZipファイル)であり、指定されたクラスファイルを検索します。たとえば、クラスパスが「。; my.jar」の場合、次の場所でcom.example.Fooを検索します。

./com/example/
my.jar:/com/example/

つまり、パッケージの「変更された名前」を持つサブディレクトリを検索します。「。」はファイル区切り文字に置き換えられます。

また、.jarファイルをネストできないことも注目に値します。

3
krakatoa

[システム変数とユーザー変数]メニューの下にクラスパスエントリを追加するだけです(親ディレクトリの場所を意味します)。

0
cbinder