私は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
親ディレクトリで-それはうまく機能しました。
コンパイルするテストアプリを入手することはできますが、実稼働コードに統合する必要がある場合、それはカットされません。まだ助けを探しています。
編集:
最後に-以前はなぜ機能しなかったのかはわかりませんが、ディレクトリ構造全体のすべてのファイルをクリーンアップしましたが、現在は機能しています。
ありがとう
さて、すでに投稿されたものを明確にするために。
ディレクトリcom
が含まれ、ディレクトリcompany
が含まれ、ディレクトリexample
が含まれ、ファイルMyClass.Java
が含まれている必要があります。
com
を含むフォルダーから、次を実行します。
$ javac com\company\example\MyClass.Java
次に:
$ Java com.company.example.MyClass Hello from MyClass!
これらは両方ともソースツリーのルートから実行する必要があります。そうしないと、javac
とJava
は他のパッケージを見つけることができません(実際、Java
はMyClass
を実行することさえできません)。
フォルダー「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 にアクセスしています
それは物事をより明確にしますか?
はい、これはクラスパスの問題です。 .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」と入力できます。それだけです。
あなたのディレクトリ構造は正しい方向に向かっているようです。依存コードをコンパイルするとき、javac
の-classpath
引数を指定します。 com
ディレクトリのparentディレクトリを使用します。ここで、com
にはcompany/thing/YourClass.class
が含まれます
あなたはたくさんの良い答えを得たので、私はただ提案を捨てます。このプロジェクトで2日間以上作業する場合は、Eclipseまたはnetbeansをダウンロードして、そこにプロジェクトをビルドします。
通常、Javaプログラマーではない場合、それが提供するヘルプは非常に貴重です。
2時間しか費やしていない場合、1/2時間のダウンロード/インストールの価値はありません。
どちらにも「インポートを修正」するホットキー/メニュー項目があります。これにより、インポートを再度心配する必要がなくなります。
標準のJavaクラスローダーはディレクトリ構造のステッカーです。クラスパスの各エントリはディレクトリまたはjarファイル(または実際にはZipファイル)であり、指定されたクラスファイルを検索します。たとえば、クラスパスが「。; my.jar」の場合、次の場所でcom.example.Fooを検索します。
./com/example/
my.jar:/com/example/
つまり、パッケージの「変更された名前」を持つサブディレクトリを検索します。「。」はファイル区切り文字に置き換えられます。
また、.jarファイルをネストできないことも注目に値します。
[システム変数とユーザー変数]メニューの下にクラスパスエントリを追加するだけです(親ディレクトリの場所を意味します)。