La spedizione di un'app desktop Clojure è realistica?


25

Attualmente sto spedendo un'applicazione Java desktop. È una semplice vecchia app Java / Swing Java 5 e finora tutto ha funzionato bene. Java 5 è stato scelto come target perché alcuni utenti erano su versione / computer OS X che non avrebbero mai avuto Java 6 (potremmo presto rimuovere questa limitazione e passare a un Java più recente e semplicemente abbandonando i miei utenti bloccati con Java 5).

Mi sto rapidamente aggiornando con Clojure ma non ho ancora fatto molto Clojure-to-Java e Java-to-Clojure e mi chiedevo se fosse realistico spedire un'applicazione desktop Clojure anziché un'applicazione Java ?

L'applicazione che sto spedendo è attualmente di circa 12 MB con tutto il .jar, quindi l'aggiunta di Clojure non sembra essere un grosso problema.

Il mio piano sarebbe che Clojure chiamasse API Java: la mia applicazione è già divisa in diversi vasetti indipendenti.

Se capisco correttamente chiamare Clojure da Java è più difficile che chiamare codice Java da Clojure, motivo per cui sostanzialmente riscriverei tutta l'interfaccia utente (parte dell'interfaccia utente, mescolando componenti Swing e BufferedImages fatti in casa deve comunque essere riscritto a causa dell'ascesa di display retina), e fare tutto il 'cablaggio' da Clojure.

Quindi questo è il problema che sto affrontando: è realistico spedire un'app desktop Clojure? (certamente non sembra essere molto diffuso, ma la spedizione di semplici app desktop Java non è così comune e lo sto facendo comunque)

Tecnicamente, cosa dovrebbe essere fatto? (rispetto alla spedizione di un'app Java)


1
Dai un'occhiata a Seesaw , è un DSL Clojure per la creazione di app GUI basate su JVM (basate su Swing).
Michael Klishin,

L'altalena sembra essere utile per costruire la GUI e fare il cablaggio, ma per quanto riguarda l'integrazione delle mie API / librerie Java esistenti? Dovrebbe essere tutto indolore? (Riferirò comunque qui ma vorrei avere un po 'più di feedback prima di provare a passare a Clojure)
Cedric Martin

ClojureScript + (NW.js o Atom Electron) farebbe il lavoro.
Mario T. Lanza,

Risposte:


28

Sì, è del tutto realistico - non molte persone sembrano ancora farlo, ma penso che sia solo una questione di tempo (Dopotutto Clojure è abbastanza nuovo!)

Ho scritto personalmente un gioco open source in Clojure che funziona come un'applicazione Swing (https://github.com/mikera/ironclad), quindi ho alcune esperienze da condividere che potrebbero essere utili.

  • In media, probabilmente si desidera che Clojure chiami le API Java. Questo è per lo più di buon senso - Java ha tutte le grandi librerie, Clojure è il linguaggio più produttivo per incollare le cose insieme.
  • Si consiglia di scrivere un "caricatore" basato su Java con un main(...)metodo che avvii la parte Clojure del codice. Tra le altre cose, questo significa che non dovrai compilare AOT il tuo codice Clojure. Codice di esempio qui: https://github.com/mikera/ironclad/blob/master/src/main/java/ic/IronClad.java
  • Probabilmente vorrai fare cose come lanciare una schermata iniziale mentre l'applicazione viene inizializzata per consentire il tempo di avvio aggiuntivo caricando / compilando il codice Clojure. Probabilmente aggiunge 1-2 secondi a un tipico tempo di avvio dell'app, il che è abbastanza che l'utente apprezzerà probabilmente un feedback. Se sei intelligente, puoi effettivamente lanciare l'intera UI mentre altre cose si caricano in background ma questo richiede un po 'di attenzione e potrebbe testare la tua concorrenza kung-fu :-)
  • È possibile mescolare Java e Clojure in modo relativamente libero poiché possono chiamare indietro e in avanti in modo abbastanza trasparente. L'unica complicazione se si desidera che Java chiami Clojure è che a Java piace conoscere la classe / interfaccia che sta chiamando in fase di compilazione. Una buona opzione è avere il codice Clojure per implementare in modo dinamico un'interfaccia Java compilata in modo casuale tramite reify .
  • Ho trovato abbastanza facile sviluppare e impacchettare un'app in un singolo jar contenente sia il codice Clojure che Java usando Eclipse / Maven. Il codice Clojure può essere semplicemente inserito src/main/resourcese viene caricato / compilato in fase di esecuzione.
  • Se lo desideri, puoi utilizzare i wrapper della GUI Clojure come un'altalena . Sembra essere abbastanza buono. Ho deciso di non usarlo, principalmente perché volevo fare alcune cose difficili con Swing direttamente e non sentivo che avevo bisogno di un ulteriore livello di astrazione.

ottima risposta ... +1. Molto interessante e grazie per il link al tuo codice sorgente: sicuramente ti aiuterà. Ora ho bisogno di rendere il mio ambiente di sviluppo "stabile" (ho appena provato le ultime leiningen + clojure-mode + nrepl.el e non funziona ... ancora;)
Cedric Martin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.