Ist der Versand einer Clojure-Desktop-App realistisch?

25

Ich versende derzeit eine Desktop-Java-Anwendung. Es ist eine einfache alte Java 5 Java / Swing-App und bis jetzt hat alles gut funktioniert. Java 5 wurde ins Visier genommen, weil einige Benutzer auf OS X-Versionen / Computern arbeiteten, auf denen Java 6 nicht mehr verfügbar sein soll (möglicherweise heben wir diese Einschränkung bald auf, wechseln zu einem neueren Java und geben meine mit Java 5 verbundenen Benutzer einfach auf).

Ich mache mich schnell mit Clojure vertraut, habe aber noch nicht wirklich viel mit Clojure-to-Java und Java-to-Clojure gemacht, und ich habe mich gefragt, ob es realistisch ist, eine Clojure-Desktopanwendung anstelle einer Java-Anwendung zu liefern ?

Die von mir gelieferte Anwendung hat derzeit etwa 12 MB mit der gesamten .jar-Datei, sodass das Hinzufügen von Clojure kein allzu großes Problem darstellt.

Mein Plan wäre, dass Clojure Java-APIs aufruft: Meine Anwendung ist bereits in mehrere unabhängige Jars unterteilt.

Wenn ich verstehe, dass das Aufrufen von Clojure aus Java schwieriger ist als das Aufrufen von Java-Code aus Clojure. Deshalb würde ich im Grunde die gesamte Benutzeroberfläche neu schreiben (ein Teil der Benutzeroberfläche, das Mischen von Swing-Komponenten und selbst erstellten gepufferten Bildern muss aufgrund des Anstiegs ohnehin neu geschrieben werden) der Retina-Anzeige) und erledigen Sie die gesamte 'Verkabelung' von Clojure.

Das ist also das Problem, vor dem ich stehe: Ist es realistisch, eine Clojure-Desktop-App auszuliefern? (Es scheint sicherlich nicht sehr verbreitet zu sein, aber dann ist es auch nicht üblich, einfache Java-Desktop-Apps zu liefern, und ich mache es trotzdem.)

Was wäre technisch zu tun? (im Vergleich zum Versand einer Java-App)

Cedric Martin
quelle
1
Schauen Sie sich Seesaw an , es ist ein Clojure DSL zum Erstellen von JVM-basierten GUI-Apps (Swing-basiert).
Michael Klishin
Wie es aussieht, kann es sich als nützlich erweisen, die GUI zu erstellen und die Verkabelung durchzuführen, aber wie sieht es mit der Integration meiner vorhandenen Java-APIs / Bibliotheken aus? Sollte alles schmerzlos sein? (Ich melde mich trotzdem hier, aber ich hätte gerne ein bisschen mehr Feedback, bevor ich versuche, zu Clojure zu wechseln.)
Cedric Martin
ClojureScript + (NW.js oder Atom Electron) würde die Arbeit erledigen.
Mario T. Lanza

Antworten:

28

Ja, es ist völlig realistisch - nicht viele Leute scheinen es noch zu tun, aber ich denke, das ist nur eine Frage der Zeit (Clojure ist schließlich ziemlich neu!)

Ich habe persönlich ein Open-Source-Spiel in Clojure geschrieben, das als Swing-Anwendung ausgeführt wird (https://github.com/mikera/ironclad).

  • Im Durchschnitt möchten Sie wahrscheinlich, dass Clojure Java-APIs aufruft. Dies ist meistens der gesunde Menschenverstand - Java hat alle großen Bibliotheken, Clojure ist die produktivere Sprache für das Zusammenkleben von Dingen.
  • Möglicherweise möchten Sie einen Java-basierten "Loader" mit einer main(...)Methode schreiben , die den Clojure-Teil des Codes startet. Dies bedeutet unter anderem, dass Sie Ihren Clojure-Code nicht AOT kompilieren müssen. Beispielcode hier: https://github.com/mikera/ironclad/blob/master/src/main/java/ic/IronClad.java
  • Möglicherweise möchten Sie einen Begrüßungsbildschirm öffnen, während Ihre Anwendung initialisiert wird, um die zusätzliche Startzeit für das Laden / Kompilieren von Clojure-Code zu berücksichtigen. Wahrscheinlich verlängert sich die Startzeit einer typischen App um 1-2 Sekunden, was ausreicht, dass Ihr Benutzer möglicherweise ein Feedback zu schätzen weiß. Wenn Sie schlau sind, können Sie die gesamte Benutzeroberfläche aufrufen, während andere Dinge im Hintergrund geladen werden. Dies erfordert jedoch einige Sorgfalt und kann Ihren Kung-Fu-Nebenläufigkeitstest ermöglichen :-)
  • Sie können Java und Clojure relativ frei mischen, da sie ziemlich transparent vor- und zurückrufen können. Die einzige Komplikation, wenn Java Clojure aufrufen soll, besteht darin, dass Java die Klasse / Schnittstelle kennt, die es zur Kompilierungszeit aufruft. Eine gute Option ist, dass Clojure-Code eine bereits kompilierte Java-Schnittstelle über reify dynamisch implementiert .
  • Ich fand es ziemlich einfach, eine App mit Eclipse / Maven in einem einzigen Jar zu entwickeln und zu verpacken, das sowohl Clojure- als auch Java-Code enthält. Der Clojure-Code kann einfach eingegeben src/main/resourcesund zur Laufzeit geladen / kompiliert werden.
  • Sie können Clojure GUI-Wrapper wie Wippe verwenden, wenn Sie möchten. Es scheint ziemlich gut zu sein. Ich habe mich dagegen entschieden, vor allem, weil ich mit Swing ein paar fummelige Dinge direkt machen wollte und nicht das Gefühl hatte, dass ich eine zusätzliche Abstraktionsebene brauchte.
mikera
quelle
tolle Antwort ... +1. Sehr interessant und vielen Dank für den Link zu Ihrem Quellcode: Es wird auf jeden Fall helfen. Jetzt muss ich meine Entwicklungsumgebung "stabil" machen (habe gerade die neueste Version von leiningen + clojure-mode + nrepl.el ausprobiert und es funktioniert noch nicht ...;)
Cedric Martin