2010-08-21 30 views
6

In meinem aktuellen Projekt muss ich Java-Code zur Laufzeit kompilieren (im Hintergrund, um Eingaben des Benutzers zu verarbeiten). Dies funktioniert gut mit tools.jar im Klassenpfad. Nicht alle Benutzer meines Programms haben jedoch JDK auf ihrem System installiert. Einige von ihnen haben nur JRE und in diesem Fall ist kein Java-Compiler zur Laufzeit verfügbar. Ich kann dieses Problem lösen, indem ich tools.jar von Sun als Teil meines Tools einfüge.Java-Compiler zur Laufzeit

Aber tools.jar ist sehr groß (> 12 MB). Das Problem ist, dass ich die große JAR-Datei einschließen muss, obwohl ich nur an einem kleinen Bruchteil der Funktionalität interessiert bin, die von diesem Glas bereitgestellt wird.

  1. Ist es möglich, die tools.jar Datei zu brechen, so dass ich eine kleine Untergruppe von Klassen, die Java-Code erforderlich sind nur für die Zusammenstellung?

  2. Ist das illegal?

Vielen Dank.

Antwort

3

Der eclose-Compiler ist nur 1,6 MB groß und sollte ohne Eclipse funktionieren. Sie können es herunterladen here. Es sieht auch so aus, als ob es den JavaCompiler API implementiert.

Es ist unter der Eclipse öffentlichen Lizenz lizenziert, so dass es in Ihrer eigenen Anwendung sollte kein Problem sein.

+0

Dies ist eine Option, die ich in Betracht gezogen habe. Ja, es ist möglich, den Eclipse-Compiler ohne Eclipse zu verwenden. Ich hatte einige Probleme mit der Verwendung es wegen seiner Thread-Caching-Verhalten, das heißt, es ist nicht möglich, mehr als eine Instanz des Compilers aus einem Thread zu erhalten. In meinem Verwendungsszenario habe ich Schwierigkeiten, die Diagnosemeldungen vom Compiler zu verfolgen, weil ich jedes Mal eine neue Instanz des Compilers benötige. – Dipmedeep

0

Ich glaube nicht, dass es möglich wäre, tools.jar zu trennen, und es sollte auch nicht legal sein, tools.jar einzuschließen.

prüfen http://forums.sun.com/thread.jspa?threadID=5161541

Sie für einige 3rd-Party-Java-Compiler aussehen könnte und Ihren Code ändern zu ihrer Verwendung.

Aber ich weiß nicht, genauen Code für die Zusammenstellung mit diesen (Dieses Java 6 und begrenzte Unterstützung für Java5 nicht unterstützt).

+1

GCJ ist nutzlos. Jikes ist vielversprechend, unterstützt aber nicht viele Java-5-Funktionen, was die meisten von uns verwenden. – TheLQ

0

Möchten Sie etwas wie Java-Scripting wie BeanShell? Es hilft Java-Code zu laufen, ohne sie zu kompilieren.

1

Anstatt Code zur Laufzeit zu kompilieren, würde ich den Code in einer Skriptsprache umschreiben und die scripting framework verwenden. Es gibt keine Notwendigkeit für die jdk und es gibt keine rechtlichen Probleme zu umgehen. Dann haben Sie auch viele Sprachen zur Auswahl, wie Beanshell, JavaScript oder jython.

+0

Ich habe die eingebaute Rhino-Implementation selbst benutzt, und es funktioniert großartig. Es hat auch den Bonus von einigen eingebauten Funktionen, die es nie in Rhino schafften, sowie den gesamten Prozess zu vereinfachen. – TheLQ

+0

JRuby jemand? :) –

0

Sie können sich die Javaassist-Bibliothek ansehen, die einen Snippet-Compiler enthält, der zum Erstellen einer Methode für die Berechnung und anschließende Verwendung dieser Methode geeignet ist.

Welches ist am besten geeignet, hängt von Ihren tatsächlichen Bedürfnissen - vor allem wie oft Sie dies tun müssen.

1

Wahrscheinlich ist eine bessere Frage warum?

Wenn Sie dynamische mathematische Berechnungen durchführen müssen, dann betrachten Sie JEval. Wenn Sie Leute brauchen, um einfache Plugins zu schreiben, sollten Sie einige der dynamischen Sprachen wie Javascript oder Python, die @Jay erwähnt, beachten.

Für alles andere sollten Sie verlangen, dass Ihr Benutzer das JDK herunterlädt, da dies das Schreiben von Java erfordert. Es wäre schwierig, einen guten Grund zu finden, warum Sie einen Compiler in Ihr Programm einbetten möchten.