javacオプションは、指定されたディレクトリ下のすべてのjavaファイルを再帰的にコンパイルします


127

プロジェクトでjavacコンパイラを使用してjavaファイルをコンパイルしています。ファイルは、このようないくつかのパッケージ上に分散されていますcom.vistas.utilcom.vistas.convertercom.vistas.LineHelpercom.current.mdcontect

これらの各パッケージにはいくつかのJavaファイルがあります。私はこのようにjavacを使用しています:

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(1行)

非常に多くのパスを指定する代わりに、親のcomディレクトリからすべてのjavaファイルを再帰的にコンパイルするようにコンパイラーに要求するにはどうすればよいですか?


2
AntやMavenなどのツールを実際に確認する必要があります。
Laurent Pireyn 2011

このSOポストは便利かもしれませんstackoverflow.com/questions/864630/...
Gopi

回答:


220

また、ある種のビルドツール(AntまたはMaven、Antは既に提案されており、簡単に開始できます)またはコンパイルを処理するIDE(Eclipseはリコンサイル戦略でインクリメンタルコンパイルを使用します。どの押すケア「コンパイル」ボタンを)。

Javacの使用

より大きなプロジェクトで何かを試す必要があり、近くに適切なビルドツールがない場合は、常にjavac提供する小さなトリックを使用できます。コンパイルするクラス名をファイルで指定できます。プレフィックスをjavac付けてファイル名を渡すだけ@です。

*.javaプロジェクト内のすべてのファイルのリストを作成できる場合、それは簡単です。

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • 利点は、それが迅速かつ簡単なソリューションであることです。
  • 欠点sources.txt、新しいソースを作成するたびにファイルを再生成する必要があるか、既存の1つのファイルの名前を変更する必要があることです。

ビルドツールの使用

長期的には、ソフトウェアを構築するために設計されたツールを使用する方が良いでしょう。

Antの使用

build.xmlソフトウェアのビルド方法を記述した単純なファイルを作成する場合:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

次のコマンドを実行して、ソフトウェア全体をコンパイルできます。

$ ant
  • 利点は、拡張が容易な標準ビルドツールを使用していることです。
  • 欠点は、追加のツールをダウンロード、セットアップ、および学習する必要があることです。ほとんどのIDE(NetBeansやEclipseなど)はビルドファイルの書き込みに優れたサポートを提供しているため、この場合は何もダウンロードする必要はありません。

Mavenの使用

Mavenをセットアップして使用するのはそれほど簡単ではありませんが、それを学んでも成果は上がります。これは、5分以内にプロジェクト開始するための優れたチュートリアルです。

  • (私にとって)主な利点は、依存関係も処理することです。そのため、これ以上Jarファイルをダウンロードして手動で管理する必要がなくなり、大規模なプロジェクトの構築、パッケージ化、およびテストに役立つことがわかりました。
  • 欠点は、それが急な学習曲線を持っていることである、と抑制のエラーに同様のMavenプラグインが:-)もう一つはツールのかなり多くはまた、(のようなMavenのリポジトリで動作していることであればSbtの Scalaのため、アイビーのAntのため、Graddle Groovyのため) 。

IDEの使用

これで、開発の生産性が向上する可能性があります。いくつかのオープンソースの代替手段(EclipseNetBeansなど、前者を好む)と、非常に人気があり強力な市販のもの(IntelliJなど)さえあります。

プロジェクトのビルドをバックグラウンドで管理できるので、すべてのコマンドラインの要素を扱う必要はありません。ただし、バックグラウンドで実際にが起こっているかを知っていると、のような偶発的なエラーを見つけ出すのに役立ちますClassNotFoundException

1つの追加のメモ

大規模なプロジェクトでは、常にIDE ビルドツールを使用することをお勧めします。前者は生産性を向上させ、後者はプロジェクトでさまざまなIDEを使用できるようにします(たとえば、Mavenは簡単なmvn eclipse:eclipseコマンドでEclipseプロジェクト記述子を生成できます)。さらに、1行のコマンドでテスト/ビルドできるプロジェクトがあると、新しい同僚や継続的統合サーバーなどに簡単に導入できます。ケーキ:-)


4
を使用する場合はjavac、出力ディレクトリを指定することをお勧めします。find -name "*.java" > sources.txt && javac -d bin @sources.txt。それ以外の場合、*。classファイルはソースがあるディレクトリに保存されます。
マクシムドミトリエフ2014

1
絶対に本当。私の意見では、誰かがをいじり始めたばかりの場合javac、の概念、CLASSPATHでコードを実行するjava方法、パッケージを処理する方法、実行するためのルートフォルダーであることなどは、通常は明確ではありません。したがって、出力ディレクトリを省略しました。とにかく、提案をありがとう!
rlegendi 2014

6
これに遭遇したMacユーザーの場合、findコマンドは次のとおりですfind . -name "*.java" > sources.txt(に注意.
MrDuk

@MrDuk「。」を追加すること 行う?現在のディレクトリ内を検索するためのものですか?
Brady Sheehan、2015年

@BradySheehanは、指定されたパスから検索を開始します。「」現在の辞書から開始することを意味します。検索のパスを指定する必要あることに注意してください(OS Xの場合)
Kris

39
find . -name "*.java" -print | xargs javac 

ちょっと残忍ですが、地獄のように動作します。(小さなプログラムでのみ使用してください、それは絶対に効率的ではありません)


1
これを使用しfind ... -print0xargs -0 ...代わりにファイル名のスペースを
分割

29

あなたのシェルがそれをサポートしているなら、このようなものはうまくいきますか?

javac com/**/*.java 

あなたのシェルがサポートしていない場合は**、多分

javac com/*/*/*.java

動作します(3つのコンポーネントを含むすべてのパッケージ-多かれ少なかれ適応します)。


私はこれをWindows 10のコマンドプロンプトで使用しようとしました。Windows10で動作するかどうか、または私がそれを間違っているかどうか誰かが確認できますか
Dan

26

プロジェクト全体をコンパイルする通常の場合は、javacにメインクラスを指定して、必要なすべての依存関係をコンパイルするだけです。

javac -sourcepath . path/to/Main.java


非常にシンプルな方法で、余分なファイルに依存しません
2015

これは、Antを学ぶ時間があまりない人(私のように)に最適で最も簡単なものです
Hamza Abbad

残念ながら怠惰です。Main.java2番目のファイルを作成した直後ではないと思われるに触れない場合、他にコンパイラーはありません。
トム・ホーティン-18年

ここでもうまく機能しません。一部の依存関係は、変更されても再コンパイルされません。@ TomHawtin-tackline私は以前にメインに触れようとしましたが何もしませんでした。多分すべてに触れる必要があります。ちょっと気まずいけど。
mmm

4

javac -cp "jar_path/*" $(find . -name '*.java')

(それらは分割してjavacを複数回実行できるため、xargsを使用しないことをお勧めします。それぞれにjavaファイルのサブセットが含まれ、その一部は同じjavacコマンドラインで指定されていない他のファイルをインポートする場合があります)

App.javaエントリポイントがある場合は、-sourcepathを使用するのが一番です。インポート依存関係に従って、必要な他のすべてのJavaファイルをコンパイルします。例えば:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

ターゲットのクラスファイルdir:を指定することもできます-d target/


3

アリの使い方を学ぶことをお勧めします。antは、このタスクに非常によく適しており、把握が非常に簡単で、十分に文書化されています。

build.xmlファイルで次のようなターゲットを定義する必要があります。

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>

2

私は次のような単純なmakefileでmakeを使用しています。

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

ソースを1つずつコンパイルし、必要な場合にのみ再コンパイルします。


1

javacコマンドは再帰的なコンパイルプロセスをたどらないため、コマンドを実行するときに各ディレクトリを指定するか、含めるディレクトリをテキストファイルに指定します。

javac -classpath "${CLASSPATH}" @java_sources.txt

0

Xcode JNIプロジェクトでこれを使用して、テストクラスを再帰的に構築しています。

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.