2

私は経験豊富なプログラマーですが、Java (主に C#) を何年も使用しておらず、過去に IDE を使用していました。Mac のコマンド ラインからコードをコンパイルしようとしていますが、テスト ファイルでソース コードを見つけることができません。問題はパッケージ、ファイル構造、クラスパス、およびインポートステートメントのどこかにあると想定していますが、スタックオーバーフローでのハンティングを含めて数時間費やしましたが、まだ行き詰まっています。

ここに私が持っているものがあります:

Directory structure:
ProjectName
|
 --src
    |
     --SourceClass
 --test
    |
     --SourceClassTest
 --external
    |
     --testng-6.8.7.jar

私の SourceClass は次のようになります。

package ProjectName;

public class SourceClass<T>{

}

とてもシンプルです。明らかに、さらに多くの機能が追加される予定ですが、実際にコーディングを行う前に、このセットアップがすべて正しいことを確認することから始めたいと思いました。

私のテストクラスは次のようになります。

package ProjectName;

import java.util.*;
import org.testng.Assert;
import org.testng.annotations.*;


    public class SourceClassTest{

            @Test
            private void createEmptySourceClass(){
                    SourceClass<Object> sourceClass = new SourceClass<Object>();
                    Assert.assertTrue(sourceClass.isEmtpy());
            }

    }

sourceClass は、「ProjectName」ディレクトリから実行される「javac src/*.java」で問題なくコンパイルされます。「SourceClassにisEmpty()メソッドがありません」という行に沿ったエラーでこれが失敗することを確認したいのですが、代わりに「ProjectName」ディレクトリから次のようにjavacを実行します。

javac test/*.java -classpath external/testng-6.8.7.jar

そして、この例外を取得します:

test/SourceClassTest.java:12: error: cannot find symbol
        SourceClass<Object> tree = new SourceClass<Object>();
        ^
  symbol:   class SourceClass
  location: class SourceClassTest
test/SourceClassTest.java:12: error: cannot find symbol
        SourceClass<Object> sourceClass = new SourceClass<Object>();
                                       ^
  symbol:   class SourceClass
  location: class SourceClassTest
2 errors

私は多くのことを試しました - import ステートメントを追加し、javac コマンドに sourcepath を追加し、sourceClass を jar としてコンパイルし、それを bin ディレクトリに入れ、それをクラスパスに追加しましたが、テストを取得できませんSourceClass シンボルを検索します。

ここで何が欠けているのか分かりますか?

4

3 に答える 3

3

別のターゲット ディレクトリにコンパイルすると機能します。例えば、

mkdir target
javac -d target/ src/*.java
javac -classpath target/ test/*.java

すると、ディレクトリ自体にファイルjavac src/*.javaが作成されます。デフォルトでは、参照するクラスはすべて同じパッケージにあると想定されます。そのため、クラスパスに追加しても を探しますが、見つかりません。オプションを渡すと、適切なパッケージ階層が作成され、クラスが検索されます。.classsrcsrc/src/ProjectName/SourceClass.class-d target/

javac 公式ドキュメントからの関連ドキュメント:

ソース ファイルは、パッケージ ツリーを反映するディレクトリ ツリーに配置する必要があります。たとえば、すべてのソース ファイルを C:\workspace に保持する場合、com.mysoft.mypack.MyClass のソース コードは C:\workspace\com\mysoft\mypack\MyClass.java にある必要があります。

デフォルトでは、コンパイラは各クラス ファイルをソース ファイルと同じディレクトリに置きます。-d を使用して別の宛先ディレクトリを指定できます (以下の「オプション」を参照)。

...

...

-d directoryクラスファイルの宛先ディレクトリを設定します。ディレクトリはすでに存在している必要があります。javac はそれを作成しません。クラスがパッケージの一部である場合、javac はパッケージ名を反映するサブディレクトリにクラス ファイルを配置し、必要に応じてディレクトリを作成します。たとえば、-d C:\myclasses を指定し、クラスの名前が com.mypackage.MyClass の場合、クラス ファイルの名前は C:\myclasses\com\mypackage\MyClass.class になります。-d が指定されていない場合、javac は、各クラス ファイルを生成元のソース ファイルと同じディレクトリに配置します。

注: -d で指定されたディレクトリは、ユーザー クラス パスに自動的に追加されません。

于 2013-09-28T16:54:56.960 に答える
1

srcそのクラスを定義するファイルが の下にあり、 javac コマンドラインでそのディレクトリについて言及していないため、 SourceClass が見つからないと思います。

私があなたなら、ファイル階層を次のように変更します。

ProjectName/src/ProjectName/SourceClass.java
ProjectName/src/ProjectName/SourceClassTest.java
ProjectName/external/testng-6.8.7.jar

次に実行しjavac src/ProjectName/*.java -classpath external/testng-6.8.7.jarます。

または、ファイル階層をそのままにして実行しますjavac src/*.java test/*.java -classpath external/testng-6.8.7.jar

于 2013-09-28T16:45:24.217 に答える