Programm zum Kompilieren von java-Dateien

kwonilchang

Aktives Mitglied
Hallo zusammen!

Im Rahmen eines Projekts möchte ich innerhalb einer Webanwendung einen Compilecheck für java-Dateien anbieten. Es sollen also Dateien hochgeladen werden, die dann auf Kompilierbarkeit hin geprüft werden sollen. Hierzu habe ich folgendes Beispiel leicht angepasst:

Java:
private boolean compile(String javaFile) throws IOException {
Process p = Runtime.getRuntime().exec(“javac “ + javaFile);
try {
p.waitFor();
}
catch (InterruptedException ie) {
System.out.println(ie);
}
int ret = p.exitValue();
return ret == 0;
}

Ich habe nun folgendes Problem: Lade ich eine nicht-kompilierbare Datei hoch, zeigt mir der Check an, dass die Datei nicht kompiliert werden kann. Lade ich nun die gleiche Datei auf einem anderen Rechner hoch, bleibt die Anwendung bei p.waitFor hängen. Ich habe auch ausprobiert, mehrere zusammengehörige Dateien (main-Programm und darin benutzte Klasse) zu testen. Ergebnisse wie oben auf zwei Rechnern verschieden. Offenbar kann jedoch bei einem Fehler in einer Klasse noch erkannt werden, dass es nicht kompiliert. Sind in der Klasse aber zwei Fehler, landet man wieder in der Endlosschleife.

Ich bin ziemlich ratlos, da ich mir die verschiedenen Ergebnisse nicht erklären kann. Ich weiß auch nicht, wie ich die Endlosschleife unterbrechen/vermeiden könnte. Habe überlegt, einen zusätzlichen Prozess anzulegen, der nach einem bestimmten Timeout einfach den kompilierenden Prozess unterbricht. Das lässt sich meines Erachtens aber nicht einsetzen, da es ja möglich wäre, dass ein größeres Programm länger zum Kompilieren brauchen würde... Hat jemand einen Tipp, wie ich hier am besten vorgehen kann? Oder kann mir vielleicht jemand erklären, wie die verschiedenen Ergebnisse zustande kommen?

Danke schonmal für Eure Antworten!
 

Runtime

Top Contributor
1. Warum willst du das übers Internet machen?
2. Wenn du das so probierst, gibst du denn auch gleich die class-Datei zurück?
3. Gib mal alle Streams des Programms aus.
 
G

Gast2

Gast
Wenn du deinen Prozess startest solltest du immer den Output- und Errorstream des Prozesses auslesen. Sonst kann es vorkommen, dass waitfor blockiert.
 

Noctarius

Top Contributor
Das wird dir in dieser Art nut begrenzt was bringen, da du so nur Abhängigkeiten an die Standard-RTL verwenden kannst. Ansonsten gibt es auch noch den ScriptEngineManager (Scripting for the Java Platform). Wenn deine Anwendung in einem JDK ausgeführt wird hast du auch Java als Sprache für dynamische Kompilierung / Ausführung im Angebot. Du brauchst dann den Javac nicht "fernsteuern".
 

kwonilchang

Aktives Mitglied
Guten Morgen,

danke für die Antworten bisher.

@Runtime, ElkeB: Das Kompilieren übers Internet ist eine Vorgabe. Bisher überprüfe ich nur, ob die Klasse kompilierbar ist, ohne eine class-Datei zurückzugeben. An das Ausgeben der Streams habe ich auch gedacht. Den Errorstream nutzte ich auch für die Anzeige der aufgetretenen Fehler am Ende des Checks. Vorher ist der Stream leer, bzw. wird ja wegen der Endlosschleife in waitFor blockiert. Meine Überlegung gestern war noch, in einer while-Schleife vom Errorstream zu lesen, solange bis hier eine Ausgabe gefunden werden kann. Dann den Prozess abbrechen. Wg. der Endlosschleife in waitFor funktioniert das in der Form aber auch nicht. Gibt es hier eine andere Möglichkeit, um festzustellen, ob etwas in den Stream geschrieben wurde?

@Noctarius: Mit Scripting habe ich bisher noch nie gearbeitet. Aber ich werde jetzt gleich mal nachlesen, wie das dynamische Kompilieren funktioniert.

Viele Grüße,

kwonilchang
 

kwonilchang

Aktives Mitglied
Hallo nochmal,

ich habe nun mal das dynamische Kompilieren ausprobiert. Dazu habe ich die tools.jar in mein Webprojekt importiert. Lasse ich nun den Check laufen, bekomme ich den Fehler

Java:
java.lang.ClassNotFoundException: com.sun.tools.javac.Main
. Das kann ich mir im Augenblick noch nicht erklären.

@Runtime: Ich muss gestehen, dass ich mit Threads noch nie wirklich programmiert habe... Daher hab ich jetzt auch keine genaue Vorstellung davon, was Du mit "schlafen lassen" meinst :-(. Der Prozess, denn ich über Runtime.exec() erzeuge, ist doch ein eigener Thread, oder? Hier habe ich aber keine Möglichkeit, den Prozess schlafen zu lassen, oder geht das mit wait()? Solange ich das exec nicht ausführe, sind die Streams ja auch noch leer. Vielleicht habe ich da eine falsche Vorstellung vom Ablauf in dieser Methode. Könntest Du mir hier bitte das genaue Vorgehen erklären? Oder mir sagen, unter welchen Stichpunkten ich genau googlen muss, da ich nichts passendes finden kann. Danke!
 

Runtime

Top Contributor
Damit meine ich, du sollst den Prozess starten, dann in deinem Prgramm Thread.sleep(10000) aufrufen und dann die Streams ausgeben.
 

kwonilchang

Aktives Mitglied
Danke für die schnelle Antwort, Runtime. Ich hab gleich mal den ersten Versuch gemacht mit der Datei, die dauernd in der Endlosschleife hing. Hat wunderbar geklappt. Ich werds mal noch mit einer geringeren Wartezeit probieren. Ich stell mir das so vor: Ich schicke den Thread schlafen, lese den Errorstream aus. Steht was drin, beende den Check. Mein Problem ist jetzt dabei nur noch, ein vernünftigen Wert für das Schlafen zu finden. Ich möchte natürlich vermeiden, eigentlich kompilierbare große Dateien als nicht-kompilierbar darzustellen. Auf der anderen Seite soll der Benutzer aber auch nicht zu lange auf das Ergebnis warten müssen... Welche Wartezeit würdest Du mir hier empfehlen?
 

Runtime

Top Contributor
Das ist recht unsicher. Mach ein paar Dateien, die du dem Programm dazulegst. Die kannst du dann alle 10min etwa neu kompilieren, die Zeit messen und beim grössten Wert noch eine Sekunde dazurechnen.
 

Noctarius

Top Contributor
Hallo nochmal,

ich habe nun mal das dynamische Kompilieren ausprobiert. Dazu habe ich die tools.jar in mein Webprojekt importiert. Lasse ich nun den Check laufen, bekomme ich den Fehler

Java:
java.lang.ClassNotFoundException: com.sun.tools.javac.Main
. Das kann ich mir im Augenblick noch nicht erklären.

Starte dein Programm mal explizit im JDK! Im JRE fehlen gewisse Klassen.
 

kwonilchang

Aktives Mitglied
danke für den Hinweis. Ich hab tools.jar jetzt auch mal in jre/lib reinkopiert. Jetzt klappt der Check auch in der Webanwendung. Da muss dann wohl die tools.jar entsprechend in den classpath des Webservers eingebunden werden. Eigentlich hatte ich das Archiv direkt in den build-path meiner Webanwendung gelegt, hier wird sie aber offenbar ignoriert...
 

kwonilchang

Aktives Mitglied
Hallo!

Ich muss hier nochmal nachhaken. Ich hatte ja mit dynamischer Kompilierung den Check in meiner Webanwendung zum Laufen gebracht. Teste ich einzelne Dateien, wird korrekt ausgegeben, ob kompilierbar oder nicht.

Wenn ich aber nun ganze Projekte mit packages hochlade, funktioniert der compilecheck nicht immer richtig. Ich dachte immer, ich muss zuerst die Main-Klasse kompilieren und der compiler "sucht" sich die darin verwendeten Klassen dann selbst aus dem package. Offenbar ist dies aber nicht der Fall, da ich "compile fehlgeschlagen" angezeigt bekomme, wenn ich ein komplilierbares Projekt kompilieren möchte.

Leider finde ich zur Funktionsweise des Javacompilers im Internet nix passendes. Kann mir einer von Euch bei diesem Problem weiterhelfen?

Danke schonmal und viele Grüße,

kwonilchang
 

kwonilchang

Aktives Mitglied
Hm, also recht viel zu zeigen gibts da eigentlich net. Hier mal die Methode, in der compiliert wird:

Java:
private String checkData(String filename)  {
	String[] javacCmdLineArgs = { "-d", System.getProperty("user.dir"),
		filename };
	
	int status = com.sun.tools.javac.Main.compile(javacCmdLineArgs);
	
	boolean isPassed = (status == 0);
	String result = "";
	
	if (!isPassed) {
	    result = result + "Could not compile.";
	} else {
	    result = result + "Compilation was successfull.";
	}

	return result;
    }

Muss ich die Methode doch zuerst auf die verwendeten Klassen und dann auf die Hauptklasse des Projekts anwenden? Versteh das net, wenn ich in der Konsole die Hauptklasse mit javac aufrufe, klappt das copile ja auch...
 

kwonilchang

Aktives Mitglied
danke für den Link. Bin aber leider immer noch nicht weitergekommen. Ich hab im args-Array das "-d" etc. durch "-sourcepath" und die einzelnen Pfade zu den Klassen ersetzt. Dies ist zwar überflüssig, weil sich die Dateien eh alle im gleichen Ordner befinden, aber ich wollts mal ausprobieren.

Klasse1 wird compiliert. Meine Main-Klasse Klasse2 legt ein Objekt der Klasse1 an. Beim Aufruf Klasse1 k = new Klasse1(); meckert der compiler nun: "cannot find symbol" bei K im new-Statement... Dies bedeutet doch, dass er die Klasse1 nicht finden kann, oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Java-Programm kompilieren Java Basics - Anfänger-Themen 24
J Aus einem Java Programm eine .java datei Kompilieren Java Basics - Anfänger-Themen 6
B Ich kann mein Java Programm net Kompilieren? Java Basics - Anfänger-Themen 8
B Compiler-Fehler [Lejos] [RCX] Programm lässt sich nicht kompilieren Java Basics - Anfänger-Themen 5
P Programm zum kompilieren Java Basics - Anfänger-Themen 2
V Compiler-Fehler Programm lässt sich nicht kompilieren Java Basics - Anfänger-Themen 22
T Programm läßt sich nicht kompilieren Java Basics - Anfänger-Themen 4
J Kann mein Programm nicht Kompilieren? Java Basics - Anfänger-Themen 9
T Fehler beim Kompilieren vom Programm Java Basics - Anfänger-Themen 10
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
M Java Mail Programm Java Basics - Anfänger-Themen 4
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
M Mini Jar-Programm Java Basics - Anfänger-Themen 51
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
M Das Programm stellt nichts dar Java Basics - Anfänger-Themen 2
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
Z Programm Ideen Java Basics - Anfänger-Themen 8
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
T Programm stürzt ab Java Basics - Anfänger-Themen 40
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
K Ist das Programm schlecht bzw. schlampig programmiert ? Java Basics - Anfänger-Themen 9
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
nbergmann IntelliJ: Wie lade ich ein fertiges Programm aus dem Lehrbuch? Java Basics - Anfänger-Themen 26
D Anfängerfrage zu meinem Programm. Java Basics - Anfänger-Themen 15
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Kydo Programm Beschreibung Java Basics - Anfänger-Themen 3
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Wo hält das Programm an? Java Basics - Anfänger-Themen 11
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
Fugover Kopfrechnen-Programm Java Basics - Anfänger-Themen 6
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
J selbst erstellte Datei mit Programm öffnen Java Basics - Anfänger-Themen 10
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
A wie kann ich es in meinem Programm rein tun Java Basics - Anfänger-Themen 8
S Fehler beim Programm Java Basics - Anfänger-Themen 2
Jose05 Fehler im Programm feststellen Java Basics - Anfänger-Themen 2
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
A Lotto Programm Java Basics - Anfänger-Themen 3
S Programm erstellen Java Basics - Anfänger-Themen 3
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
S MinMax Programm erstellen Java Basics - Anfänger-Themen 4
J Interpreter-Fehler Programm gibt nicht gewünschtes Ergebnis aus Java Basics - Anfänger-Themen 11
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
B Java Programm soll mit Python kommunizeren Java Basics - Anfänger-Themen 1
SpigBin Programm läuft nicht weiter... Java Basics - Anfänger-Themen 10
M JAVA Programm in Website einbinden Java Basics - Anfänger-Themen 19
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
B Programm beendet sich nicht und weiteres seltsames Verhalten Java Basics - Anfänger-Themen 9
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
WAB9703-04 Programm zum automatischen Ausfüllen von Formularen programmieren Java Basics - Anfänger-Themen 3
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
G Programm Code Java Basics - Anfänger-Themen 5
CptK Achsenskalierung in Koordinatensystem hängt Programm auf Java Basics - Anfänger-Themen 5
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
Sajeel Chattha Dieses Programm umschreiben Java Basics - Anfänger-Themen 5
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
A Programm Histogram Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
CT9288 Interaktion mit laufendem Programm -Fachbegriffe Java Basics - Anfänger-Themen 2
Gaudimagspam Assertions im Programm hinzufügen Java Basics - Anfänger-Themen 4
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
W Programm dass Palindrome erkennt Java Basics - Anfänger-Themen 6
K Erste Schritte Programm geht aus Schleife, warum? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben