交付Clojure桌面应用程序是否现实?


25

我目前正在运送桌面Java应用程序。这是一个普通的旧的Java 5 Java / Swing应用程序,到目前为止,一切正常。定位Java 5是因为某些用户使用的OS X版本/计算机永远都不会安装Java 6(我们可能很快会取消此限制,而改用较新的Java,而只是放弃使用Java 5的用户)。

我很快就开始了解Clojure,但我还没有真正做过很多Clojure-to-Java和Java-to-Clojure,我想知道是否交付Cloclore桌面应用程序而不是Java应用程序是否现实?

我正在运送的应用程序当前带有所有.jar约12 MB,因此添加Clojure似乎没有太大问题。

我的计划是使用Clojure调用Java API:我的应用程序已经划分为几个独立的jar。

如果我了解正确地从Java调用Clojure比从Clojure调用Java代码难,这就是为什么我基本上要重写所有UI(部分UI,混合Swing组件和自制BufferedImages的原因,无论如何都要重写)视网膜显示),并完成Clojure的所有“布线”。

这就是我面临的问题:交付Clojure桌面应用程序是否现实?(它当然似乎并不广泛,但是随后交付普通的Java桌面应用程序也不是那么普遍,而且我还是这样做了)

从技术上讲,需要做什么?(与交付Java应用程序相比)


1
看一下Seesaw,它是一种Clojure DSL,用于构建基于JVM的GUI应用程序(基于SWing)。
Michael Klishin 2012年

跷跷板看起来可能对构建GUI和进行布线很有用,但是如何集成现有的Java API /库呢?这一切应该没有痛苦吗?(无论如何我都会在这里报告,但是在尝试切换到Clojure之前我想得到更多反馈)
Cedric Martin

ClojureScript +(NW.js或Atom Electron)可以完成这项工作。
Mario T. Lanza

Answers:


28

是的,这是完全现实的-似乎还没有很多人这样做,但是我认为这只是时间问题(毕竟,Clojure相当新!)

我亲自在Clojure中编写了一个开源游戏,该游戏可以作为Swing应用程序运行(https://github.com/mikera/ironclad),因此有一些经验可以分享,可能会有用。

  • 平均而言,您可能希望对Java API调用Clojure。这通常是常识-Java具有所有出色的库,Clojure是将事物粘合在一起的生产力更高的语言。
  • 您可能想用一种main(...)启动代码的Clojure部分的方法来编写基于Java的“加载器” 。除其他外,这意味着您不必AOT编译Clojure代码。此处的示例代码:https : //github.com/mikera/ironclad/blob/master/src/main/java/ic/IronClad.java
  • 您可能想要做一些事情,例如在应用程序初始化时抛出启动屏幕,以允许额外的启动时间加载/编译Clojure代码。这可能会使典型的应用启动时间增加1-2秒,这足以使您的用户可能会喜欢一些反馈。如果您很聪明,您实际上可以在整个后台加载其他UI时抛出整个UI,但这需要格外小心,并且可能会测试您的并发功夫:-)
  • 您可以相对自由地混合使用Java和Clojure,因为它们可以相当透明地进行向后和向前调用。如果要Java调用Clojure,唯一的麻烦就是Java喜欢在编译时知道它正在调用的类/接口。一个好的选择是让Clojure的代码中动态实现通过已位于编译Java接口具体化
  • 我发现使用Eclipse / Maven在包含Clojure和Java代码的单个jar中开发和打包应用程序非常容易。Clojure代码可以简单地放入src/main/resources并在运行时加载/编译。
  • 如果愿意,可以使用像跷跷板这样的Clojure GUI包装。看起来还不错。我决定不使用它,主要是因为我想直接用Swing做一些有趣的事情,并且不觉得我需要额外的抽象层。

好答案... +1。非常有趣,感谢您提供源代码的链接:它一定会有所帮助。现在,我需要使开发环境“稳定”(刚刚尝试了最新的leiningen + clojure-mode + nrepl.el,它尚无法正常工作……)
Cedric Martin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.