# Rekursiv kompilieren mit javac



## Roman (25. Feb 2005)

Hallo zusammen

Ich möchte meine Java-Dateien gerne kompilieren. Diese sind in einem src-Ordner (project/src) und dort halt wie üblich in den Package-Ordnern.
Diese sollen nach projekt/classes kompiliert werden. Die Verzeichnisstruktur sollte natürlich erhalten bleiben, damit ich sie auch in ein Jar einfügen kann. Dazu möchte ich gerne den javac-Compiler nehmen.

Leider hakt es bei mir etwas mit den Kommandos. Ich probierte schon diverse, aber zu klappen scheint nichts:

(im Beispiel habe ich für projekt/classes einfach projekt/tmp genommen)

```
D:\java\LioDbView>javac -sourcepath d:\java\LioDbView\src -d d:\java\LioDbView\tmp -classpath d:\java\LioDbView\tmp
javac: no source files
(...)
```

Ich kann dem SourcePath auch noch einen Backslash anfügen, funktioniert leider auch nicht. Auch wenn ich nur den Parameter -d nehme, klappts nicht, genauso wie wenn ich nur -classpath nehme. Auch relative Pfade helfen nicht...

Kann mir wer helfen und sagen, was ich falsch mache bzw. ob das mit javac überhaupt möglich ist?

Vielen Dank
Roman


----------



## foobar (25. Feb 2005)

Wechsel in das Verzeichnis in dem die Klassen liegen und führe javac myPack.MyClass aus. 

Ansonsten guck dir mal ant an.


----------



## Bleiglanz (25. Feb 2005)

:\java\LioDbView>javac -sourcepath d:\java\LioDbView\src -d d:\java\LioDbView\tmp *.java


----------



## Roman (25. Feb 2005)

@foobar
Es sind mehrere Verzeichnisse und hunderte von Sourcen... => dürfte sehr aufwendig werden, ausserdem muss bei Änderungen in der Package-Struktur immer auch das Compile-Batch geändert werden.
Das Ziel ist, dass sämtliche Dateien NUR mit installiertem JDK (und JRE) unter Windows kompiliert und ausgeführt werden können, darum kommt Ant für mich nicht in Frage. Hab das wohl zuwenig betont, sorry 

@Bleiglanz
D:\java\LioDbView>javac -sourcepath d:\java\LioDbView\src -d d:\java\LioDbView\tmp *.java
error: cannot read: *.java
1 error

Leider nicht...


----------



## Student (25. Feb 2005)

Ich hatte mir mal für ein Projekt folgende Batch-Datei geschrieben ..

```
del /s/q *.class

javac -d \jsrc\bin \jsrc\project04\messung\*.java
javac -d \jsrc\bin \jsrc\project04\messung\test\*.java
javac -d \jsrc\bin \jsrc\project04\remoteMessung\*.java
[..]
```

Die wurde dann einfach aufgerufen und die Dateien wurde kompiliert. Nachteil ... Du musst eben alle Verzeichnisse angeben.


----------



## Roman (25. Feb 2005)

Anscheinend gehts wirklich nicht anders...
Schade, dass das javac (noch?) nicht kann  :cry:


----------



## Bleiglanz (25. Feb 2005)

es reicht die "Main-klasse" zu kompilieren (alles andere wird dann mitübersetzt???) 

hab ich mal gelesen...


----------



## mic_checker (27. Feb 2005)

Hab dazu mal was in einem Buch nachgelesen:



> You may find it surprising that the second choice works since the Employee.java file is never explicitly compiled. However, when the Java compiler sees the Employee class being used inside EmployeeTest.java, it will look for a Employee.class file. If it does not find that file, it automatically searches for Employee.java and then compiles it. Even more is true: if the time stamp of the version of Employee.java that it finds is newer than that of the existing Employee.class file, the Java compiler will automatically recompile the file.



Der dazugehörige Source-Code (stark-verkürzt):


```
import java.util.*;

public class EmployeeTest {
	public static void main(String[] args) {
		Employee[] staff = new Employee[3];
		//		....
	}
}

class Employee {
	// ....
}
```

Scheinbar werden also automatisch die Klassen mitkompiliert die in der Hauptklasse verwendet werden.

Btw. bei besagtem Buch handelt es sich um Core Java 2, Volume I - Kapitel 4.


----------



## Roman (28. Feb 2005)

Hallo mic_checker

Gute Nachricht: Hast Recht   Der kompiliert alles, was benötigt wird.

Schlechte Nachricht: Ich binde Klassen dynamisch ein, d.h. per java.reflect.

Ich löse es nun so, dass er das gesamte Package mit den dynamisch einzubindenden Klassen kompiliert (*.java).

Vielen Dank für eure Hilfe!


----------

