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


84

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

javacを使用してターミナルからこのすべてをコンパイルするにはどうすればよいですか?


好奇心から、Windows、Linux、Macなど、どのOSを使用していますか?これは質問に答えるのに役立つかもしれません
Zach L

1
私はここ数年コマンドラインでjavaをコンパイルしていませんが、main()を含むファイルをjavacに渡すだけで、すべての依存関係が可能になるため、コンパイルする必要のある他のすべてのファイルが検索されると思います。 main()を含むファイルから発見されました。
エンドファージ2011年

回答:


59

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

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java

2
私はそれを理解しました:名前またはワイルドカードを使用して、javacの後にすべての.javaファイルをリストするだけです。
euphoria83

52
または、を使用しますjavac $(find . -name "*.java")
ゲオルクSchölly


40

.javaメインクラスが依存しないファイルをコンパイルせずに)メインクラスを実行するだけの場合は、次の操作を実行できます。

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

または

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

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


4
これは、これまでで最も簡単に機能するソリューションです。なぜ人々はそれを嫌うのですか?
alphaaa 2013年

11
おそらく、その単純さは、ライブラリまたはサポートコードの多くのコンパイルジョブに、必要なすべての依存関係にリンクするメインメソッドがないという事実を無視しているためです。これは良い答えですが、フレームワークやパブリックコードベースで使用することはありません。
Ajax

4
IMHO、フレームワーク、またはその他の公共プロジェクトでは、何らかのビルド管理を使用する必要があります。この種のコンパイルは、小さなプライベートプロジェクトでのみ意味があります。
svenwltr 2013年

@Ajaxですが、その場合は、-sourcepath .オプションを使用して、同じ効果のメインファイルに名前を付けることもできます
coderatchet 2016年

1
メインがあると誰が言いますか?4つのメインがないと誰が言いますか?出力に必要なすべてのクラスは、mainによって参照されていますか(META-INF / servicesまたは他のサービスロード手法を使用していません)。メインをテストするだけの場合、この方法は問題ありませんが、「特定のディレクトリ内のすべてのJavaファイルをコンパイルする」という完全なタスクに対処できません。適切なビルドシステムは1番で、CLIツールfind . -type f -name "*.java" | xargs javac は2番です。このメソッドは、アプリ全体を網羅する単一のメインメソッドエントリポイントがある場合にのみ使用できます。
Ajax

12

これはかなり複雑な作業なので、私はJonの提案を受けてAntを使用します。

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

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

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


1
Windowsではfind_gnu . -type f -name "*.java" | xargs javac、find.exeのgnuバージョンの名前がfind_gnu.exeに変更されると使用できます。gnufi​​nd.exeをmsysgitから取得しました。
n611x007 2012年

または、純粋なWindowsバッチの場合:(でfor /f "usebackq" %f in (``dir /s /b *.java``) do javac %f単一引用符を使用dir /s /bしますが、正しくフォーマットする方法が見つかりません)。
マシュー2014年

find各Javaクラスを個別にコンパイルし、非常に遅くなるため、解決策には問題があると思います。
AlikElzin-kilaka 2018年

12

以下は私が見つけた方法です:

1)次のようにファイル(FilesList.txtなど)内の相対パスを使用してファイルのリストを作成します(スペース区切りまたは行区切り)。

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java

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

javac @FilesList.txt -d classes

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

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

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

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


javacは「バッチ」ファイルをサポートしているため、これはより「ネイティブ」な方法です
lovespring 2016年

パスにスペースが含まれている場合、「dir * .java / s / b> FilesList.txt」アプローチは機能しません。javacはFilesList.txtについて文句を言います
aderesh

10

既存の回答は、*。javaファイル自体にのみ関係しているようであり、ビルドに必要となる可能性のあるライブラリファイルを使用して簡単に実行する方法には関係していません。

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

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

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



9

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

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

以下を含むcompileというターゲットを使用してビルドスクリプトを作成する必要があります。

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

次に、以下を実行してすべてのファイルをコンパイルできるようになります。

 ant compile

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


残念ながら、これはantをサポートしていないサーバーで実行されます。
euphoria83 2011年

2

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

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +

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

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR

2

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

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

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

javac src\\*.java -d bin

1
動作しますが、
超低速
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.