プロジェクトでJavaファイルをコンパイルするためにjavacコンパイラを使用しています。ファイルは、com.vistas.util
、com.vistas.converter
、com.vistas.LineHelper
、com.current.mdcontect
のような複数のパッケージに分散されます。
これらの各パッケージには、いくつかのJavaファイルがあります。私はこのようなjavacを使用しています:
javac com/vistas/util/*.Java com/vistas/converter/*.Java
com.vistas.LineHelper/*.Java com/current/mdcontect/*.Java
(1行で)
非常に多くのパスを指定する代わりに、親のcomディレクトリからすべてのJavaファイルを再帰的にコンパイルするようにコンパイラーに依頼するにはどうすればよいですか?
また、何らかのビルドツール( Ant または Maven 、Antが既に推奨されており、簡単に開始できる)またはIDEを使用することをお勧めしますコンパイルを処理します(Eclipseは調整戦略を使用したインクリメンタルコンパイルを使用し、"Compile"ボタンを押す必要さえありません)。
大きなプロジェクトで何かを試してみる必要があり、近くに適切なビルドツールがない場合は、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
ファイルを再生成する必要があることです。 (したがって、エラーが発生しやすい)面倒なタスクを忘れる。長期的には、ソフトウェアを構築するために設計されたツールを使用することをお勧めします。
ソフトウェアのビルド方法を説明する簡単なbuild.xml
ファイルを作成する場合:
<project default="compile">
<target name="compile">
<mkdir dir="bin"/>
<javac srcdir="src" destdir="bin"/>
</target>
</project>
次のコマンドを実行して、ソフトウェア全体をコンパイルできます。
$ ant
Mavenのセットアップと操作はそれほど簡単ではありませんが、Mavenを学習することは有益です。 5分以内にプロジェクトを開始する の優れたチュートリアルを次に示します。
これで、開発の生産性が向上します。いくつかのオープンソースの選択肢( Eclipse や NetBeans など、私は前者を好む)や商用のもの( IntelliJ など)もあります人気があり強力です。
彼らはプロジェクトの構築をバックグラウンドで管理できるので、すべてのコマンドラインを扱う必要はありません。ただし、バックグラウンドで実際に発生するを知っていると、常に便利になり、ClassNotFoundException
のような偶発的なエラーを見つけることができます。
大規模なプロジェクトでは、IDEおよびビルドツールを使用することを常にお勧めします。前者は生産性を向上させ、後者は異なるIDEをプロジェクトで使用できるようにします(たとえば、Mavenは単純なmvn Eclipse:eclipse
コマンドでEclipseプロジェクト記述子を生成できます)。さらに、1行のコマンドでテスト/ビルドできるプロジェクトを作成すると、新しい同僚や継続的な統合サーバーなどに簡単に導入できます。ケーキ:-)
find . -name "*.Java" -print | xargs javac
ちょっと残忍ですが、地獄のように動作します。 (小さなプログラムでのみ使用してください、それは絶対に効率的ではありません)
シェルがサポートしている場合、このようなものは動作しますか?
javac com/**/*.Java
シェルが**
をサポートしていない場合は、
javac com/*/*/*.Java
動作します(3つのコンポーネントを持つすべてのパッケージ-多かれ少なかれ適応します)。
プロジェクト全体をコンパイルする通常の場合、メインクラスをjavacに指定するだけで、必要なすべての依存関係をコンパイルできます。
javac -sourcepath . path/to/Main.Java
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/
。
ant を使用して学習することをお勧めします。これは、このタスクに非常に適しており、非常に把握しやすく、十分に文書化されています。
Build.xmlファイルで次のようなターゲットを定義する必要があります。
<target name="compile">
<javac srcdir="your/source/directory"
destdir="your/output/directory"
classpath="xyz.jar" />
</target>
次のような単純な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つずつコンパイルし、必要な場合にのみ再コンパイルします。
javacコマンドは再帰的なコンパイルプロセスに従っていないため、コマンドの実行時に各ディレクトリを指定するか、含めるディレクトリをテキストファイルに指定します。
javac -classpath "${CLASSPATH}" @Java_sources.txt
Xcode JNIプロジェクトでこれを使用して、テストクラスを再帰的に構築しています。
find ${PROJECT_DIR} -name "*.Java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}