web-dev-qa-db-ja.com

Java:コードのディレクトリ構造全体をコンパイルするにはどうすればよいですか?

ユースケースは簡単です。 Eclipseを使用して作成されたソースファイルを入手しました。そのため、Javaクラスは、同じ、子、兄弟、または親フォルダー内の別のJavaクラスを参照できる、深いディレクトリ構造があります。

Javacを使用して端末からこの全体をコンパイルするにはどうすればよいですか?

75
euphoria83

すべてのディレクトリを知っているか、ワイルドカード..を使用できる必要があります。

javac dir1/*.Java dir2/*.Java dir3/dir4/*.Java dir3/dir5/*.Java dir6/*src/*.Java
52

Bash 4では、globstarを有効にできます

shopt -s globstar

してから

javac **/*.Java
46
Daniel Lubarov

メインクラスを実行するだけであれば(メインクラスが依存していない.Javaファイルをコンパイルせずに)、次の操作を実行できます。

cd <root-package-directory>
javac <complete-path-to-main-class>

または

javac -cp <root-package-directory> <complete-path-to-main-class>

javacは、すべての依存関係を自動的に解決し、すべての依存関係もコンパイルします。

36
Bharat Khatri

Jon の提案を受けて、Antを使用します。これは非常に複雑なタスクだからです。

ただし、ターミナルですべてを1行で取得することに決めた場合、Linuxでは find コマンドを使用できます。 。しかし、FooBarを使用していても、Foo.JavaがBar.Javaの後にコンパイルされるという保証はないため、これはまったくお勧めしません。例は次のとおりです。

find . -type f -name "*.Java" -exec javac {} \;

すべてのクラスがまだコンパイルされていない場合、1つのメインハーネスクラスまたはドライバークラス(基本的にはメインメソッドを含むクラス)がある場合、そのメインクラスを個別にコンパイルすると、たとえプロジェクトが異なるフォルダーにあっても、ほとんどのプロジェクトをコンパイルできますJavacは、依存関係の問題を解決するために、最大限の能力を発揮しようとします。

12
Zach L

私が見つけた方法は次のとおりです。

1)次のように、ファイル内の相対パスを使用してファイルのリストを作成します(たとえば、FilesList.txt)(スペースで区切るか、行で区切って)。

foo/AccessTestInterface.Java
foo/goo/AccessTestInterfaceImpl.Java

2)次のコマンドを使用します。

javac @FilesList.txt -d classes

これにより、すべてのファイルがコンパイルされ、クラスファイルがクラスディレクトリ内に配置されます。

FilesList.txtを作成する簡単な方法は次のとおりです。ソースルートディレクトリに移動します。

dir *.Java /s /b > FilesList.txt

ただし、これにより絶対パスが設定されます。テキストエディタを使用して、ソースディレクトリ(最後に\を含む)までのパスを ""(つまり空の文字列)で保存し、保存します。

10
Ameya Gokhale

これを階層的に行うには、Antのようなものを使用する必要があります。

http://ant.Apache.org/manual/Tasks/javac.html

以下を含むコンパイルと呼ばれるターゲットでビルドスクリプトを作成する必要があります:

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.Java"/>
</javac>

その後、次のコマンドを実行して、すべてのファイルをコンパイルできます。

 ant compile

または、プロジェクトをEclipseにインポートすると、そのプロジェクトのすべてのソースファイルが自動的にコンパイルされます。

9
Jon

すでに存在する答えは、*。Javaファイル自体にのみ関係するようで、ビルドに必要なライブラリファイルを使用して簡単に行う方法ではありません。

すべての* .Javaファイルを再帰的に取得し、ビルドに必要な* .jarファイルを含むニースな1行の状況は次のとおりです。

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .Java)

ここで、binファイルはクラスファイルの宛先であり、lib(および場合によっては現在の作業ディレクトリ)にはライブラリファイルが含まれ、srcディレクトリ以下のすべてのJavaファイルがコンパイルされます。

9
demongolem

Windowsソリューション:サブディレクトリ「src」に含まれるすべてのファイルを想定し、それらを「bin」にコンパイルします。

for /r src %i in (*.Java) do javac %i -sourcepath src -d bin

Srcの直下に.Javaファイルが含まれている場合、これは高速です

javac src\\*.Java -d bin
2
Mike

パイプ文字を使用せずにこれを行う方法があります。これは、別のプログラミング言語からプロセスをフォークしてこれを行う場合に便利です。

find $Java_SRC_DIR -name '*.Java' -exec javac -d $OUTPUT_DIR {} +

ただし、Bashを使用している場合やパイプを使用してもかまわない場合は、次のことができます。

find $Java_SRC_DIR -name '*.Java' | xargs javac -d $OUTPUT_DIR
2
bolinfest