ユースケースは単純です。Eclipseを使用して作成されたソースファイルを入手しました。したがって、深いディレクトリ構造があり、任意のJavaクラスが、同じ、子、兄弟、または親フォルダ内の別のJavaクラスを参照している可能性があります。
javacを使用してターミナルからこのすべてをコンパイルするにはどうすればよいですか?
ユースケースは単純です。Eclipseを使用して作成されたソースファイルを入手しました。したがって、深いディレクトリ構造があり、任意のJavaクラスが、同じ、子、兄弟、または親フォルダ内の別のJavaクラスを参照している可能性があります。
javacを使用してターミナルからこのすべてをコンパイルするにはどうすればよいですか?
回答:
すべてのディレクトリを知っているか、ワイルドカードを使用できる必要があります。
javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
javac $(find . -name "*.java")
。
Bash 4+を使用すると、globstarを有効にすることができます
shopt -s globstar
そしてします
javac **/*.java
(.java
メインクラスが依存しないファイルをコンパイルせずに)メインクラスを実行するだけの場合は、次の操作を実行できます。
cd <root-package-directory>
javac <complete-path-to-main-class>
または
javac -cp <root-package-directory> <complete-path-to-main-class>
javac
すべての依存関係を自動的に解決し、すべての依存関係もコンパイルします。
-sourcepath .
オプションを使用して、同じ効果のメインファイルに名前を付けることもできます
find . -type f -name "*.java" | xargs javac
は2番です。このメソッドは、アプリ全体を網羅する単一のメインメソッドエントリポイントがある場合にのみ使用できます。
これはかなり複雑な作業なので、私はJonの提案を受けてAntを使用します。
ただし、ターミナルですべてを1行にまとめる場合は、Linuxで findコマンドを。ただし、これはまったくお勧めしません。たとえば、をFoo
使用していても、Foo.javaがBar.javaの後にコンパイルされるという保証はないからBar
です。例は次のとおりです。
find . -type f -name "*.java" -exec javac {} \;
すべてのクラスがまだコンパイルされていない場合、メインハーネスまたはドライバークラスが1つ(基本的にはmainメソッドを含むもの)ある場合、そのメインクラスを個別にコンパイルすると、異なるフォルダーにある場合でも、プロジェクトのほとんどがコンパイルされます。 Javacは、依存関係の問題を解決するために最大限の能力を発揮します。
find_gnu . -type f -name "*.java" | xargs javac
、find.exeのgnuバージョンの名前がfind_gnu.exeに変更されると使用できます。gnufind.exeをmsysgitから取得しました。
for /f "usebackq" %f in (``dir /s /b *.java``) do javac %f
単一引用符を使用dir /s /b
しますが、正しくフォーマットする方法が見つかりません)。
find
各Javaクラスを個別にコンパイルし、非常に遅くなるため、解決策には問題があると思います。
以下は私が見つけた方法です:
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
ただし、これにより絶対パスが作成されます。テキストエディタ「すべて置換」を使用して、ソースディレクトリ(最後に\を含む)までのパスを「」(つまり空の文字列)で保存します。
既存の回答は、*。javaファイル自体にのみ関係しているようであり、ビルドに必要となる可能性のあるライブラリファイルを使用して簡単に実行する方法には関係していません。
すべての* .javaファイルを再帰的に取得し、ビルドに必要な* .jarファイルを含める1行の状況は次のとおりです。
javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)
ここで、binファイルはクラスファイルの宛先であり、lib(および場合によっては現在の作業ディレクトリ)にはライブラリファイルが含まれ、srcディレクトリ以下のすべてのjavaファイルがコンパイルされます。
これを階層的に行うには、Antのようなものを使用する必要があります。
http://ant.apache.org/manual/Tasks/javac.html
以下を含むcompileというターゲットを使用してビルドスクリプトを作成する必要があります。
<javac sourcepath="" srcdir="${src}"
destdir="${build}" >
<include name="**/*.java"/>
</javac>
次に、以下を実行してすべてのファイルをコンパイルできるようになります。
ant compile
または、プロジェクトをEclipseにインポートすると、そのプロジェクトのすべてのソースファイルが自動的にコンパイルされます。