0

特定の数のパッケージに含まれるさまざまな数の Java クラスで構成されるアプリケーションを Java でコンパイルしようとしています。コマンド ラインで、ルート パッケージを含むフォルダーに移動し、次のように入力します。

javac rootpackage/subpackage/*.java

また

javac rootpackage/*/*.java

私のルートパッケージのすべてのプライマリサブパッケージですべてのJavaクラスをコンパイルします。

ただし、Java アプリケーション内でこれを実行できるようにしたいと考えています。(アイデアは、ユニット テストを含むアプリケーションを学生に提供することです。ユニット テストは学生のコードに対して実行する必要があり、アプリケーションは、テスト結果が「透かし」されたソース ファイルを含む JAR ファイルを作成します。すべてこれは問題なく動作しますが、テストしたクラス ファイルが提出されたソース ファイルから作成されていることを確認したいので、Java ソースをプログラムでコンパイルするという考えです)。

問題は、各学生が自分のルート パッケージを任意の場所に保存し、ファイルの場所を JavaCompiler (javax.tools) に渡すことができないことです。

可能であれば、任意に配置されたルートパッケージを適切にコンパイルする方法についてヒントを与えることができますか?

乾杯

リチャード

より詳しい情報:

学生のフォルダ構造は次のとおりです。

/home/student/work/java/myproject/

ルートパッケージが含まれています。彼らはアプリケーション (このフォルダーに保存されている可能性があり、したがって問題はありませんが、他の場所に保存されている可能性が高い) を起動し、ルート パッケージを含むフォルダーを要求します。入力後、学生は [JAR の作成] ボタンをクリックします。これにより、パッケージ内のファイルがコンパイルされ、新しくコンパイルされたファイルに対してテストが実行され、JAR が作成されます。

この問題について考えながら、ルート パッケージを含むフォルダに「JAR の作成」アプリケーションをインストールするよう学生に指示することで解決できる可能性があります。

4

2 に答える 2

0

JavaCompiler.getTask()の最後の引数はIterable <?コンパイラに渡すコンパイル単位を含むJavaFileObject>を拡張します。提供されているJavaFileObjectの実装の1つは、SimpleFileJavaObject(http://java.sun.com/javase/6/docs/api/javax/tools/SimpleJavaFileObject.html)です。これは、Fileオブジェクトから簡単に作成できるjava.net.URIオブジェクトを使用して構築されます。すべてをまとめて、次のようなことを行います。

List<JavaFileObject> javaFiles = new ArrayList<JavaFileObject>();
File javaFile = new File(rootPackageDirFromUser, fileNameInRootDir);
URI javaURI = javaFile.toURI();
javaFiles.add(new SimpleJavaFileObject(javaURI, JavaFileObject.Kind.SOURCE));
JavaCompiler.CompilationTask task =
    ToolProvider.getSystemJavaCompiler().getTask(..., javaFiles);

ここで、rootPackageDirFromUserは、ファイルを保存した場所を示すユーザーによって指定され、fileNameInRootDirは、そのディレクトリ内のJavaソースファイルの名前です。事前にファイル名がわからない場合は、rootPackageDirFromUserを反復処理してリストを作成する必要があります。

私はこれをテストしていませんが、それはあなたに一般的な考えを与えるはずです。

于 2010-02-04T02:16:25.720 に答える
0

行頭の各 .java ファイルの先頭をのぞいていただけますか。

package com.blah.blah.assignment;

つまり、パッケージ名の先頭を探し、検索パスで com で始まる最初のディレクトリを探し (この例では)、このパスを JavaCompiler オブジェクトに指定します。それとも質問を誤解していますか?

javax.tools パッケージを見たところで、getFileForInput や getJavaFileForInput などのメソッドに対するすべての要求を学生のソース ディレクトリの適切な開始ディレクトリに転送する ForwardingjavaFileManager をラップする javaFilemanager 用の複合ラッパーを作成してみませんか (決定されたとおり)。ソースパスのルートを決定するために最初の .java ファイルを解析する予備ビットによって)

于 2010-02-03T13:29:17.160 に答える