web-dev-qa-db-ja.com

特定のディレクトリにあるすべてのJavaファイルを再帰的にコンパイルするjavacオプション

プロジェクトでJavaファイルをコンパイルするためにjavacコンパイラを使用しています。ファイルは、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ファイルを再帰的にコンパイルするようにコンパイラーに依頼するにはどうすればよいですか?

114
user496934

また、何らかのビルドツール( Ant または Maven 、Antが既に推奨されており、簡単に開始できる)またはIDEを使用することをお勧めしますコンパイルを処理します(Eclipseは調整戦略を使用したインクリメンタルコンパイルを使用し、"Compile"ボタンを押す必要さえありません)。

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ファイルを再生成する必要があることです。 (したがって、エラーが発生しやすい)面倒なタスクを忘れる。

ビルドツールを使用する

長期的には、ソフトウェアを構築するために設計されたツールを使用することをお勧めします。

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のセットアップと操作はそれほど簡単ではありませんが、Mavenを学習することは有益です。 5分以内にプロジェクトを開始する の優れたチュートリアルを次に示します。

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

IDEを使用する

これで、開発の生産性が向上します。いくつかのオープンソースの選択肢( EclipseNetBeans など、私は前者を好む)や商用のもの( IntelliJ など)もあります人気があり強力です。

彼らはプロジェクトの構築をバックグラウンドで管理できるので、すべてのコマンドラインを扱う必要はありません。ただし、バックグラウンドで実際に発生するを知っていると、常に便利になり、ClassNotFoundExceptionのような偶発的なエラーを見つけることができます。

補足説明

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

200
rlegendi
find . -name "*.Java" -print | xargs javac 

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

39

シェルがサポートしている場合、このようなものは動作しますか?

javac com/**/*.Java 

シェルが**をサポートしていない場合は、

javac com/*/*/*.Java

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

27
phtrivier

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

javac -sourcepath . path/to/Main.Java

23
freaker

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

(xargsを分割してjavacを複数回実行でき、それぞれがJavaファイルのサブセットを持ち、同じjavacコマンドラインで指定されていない他のファイルをインポートする可能性があるため、xargsは使用しません)

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

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

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

3
Curtis Yallop

ant を使用して学習することをお勧めします。これは、このタスクに非常に適しており、非常に把握しやすく、十分に文書化されています。

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

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

次のような単純な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つずつコンパイルし、必要な場合にのみ再コンパイルします。

2

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

javac -classpath "${CLASSPATH}" @Java_sources.txt
1
gvalenncia

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

find ${PROJECT_DIR} -name "*.Java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
0
bishopthom