用Leiningen在Java中嵌套Clojure

5

我需要为一个课程编写一些JVM代码,希望使用Clojure。我已经让它在软件栈的底部工作,但是我无法让它在GUI层和底部之间的位置起作用。我的主要问题是让Java GUI识别我的Clojure文件。我想使用Leiningen来解决这个问题,但Java编译方案似乎没有考虑到这种互操作性。答案here似乎正是我需要的。我不明白在哪里放置代码等(细节不够)。有人有什么建议吗?

我尝试制作一个插件,但它似乎不起作用。我知道我的情况肯定是边缘问题,但是解决方案将使在课堂环境中使用Clojure更加容易。

谢谢!

更多细节:

我用编译后的Clojure jar没有什么好运气。我需要创建一个(呃)有状态的Clojure类(即方法不能是静态的)。我的类的代码(src/final_project/MyLinkLayer.clj)看起来像:
(ns final_project.MyLinkLayer
  (:gen-class))

(defn -init[s] (print s))
(defn -send [dest data len] (println data))
(defn -recv [trans] (println trans))
(defn -status [] (println "I am a status!"))
(defn -command [cmd value] (println (str cmd " with value=" value)))

我的 project.clj 文件是

(defproject final_project "0.1.0-SNAPSHOT"
  :description "A simulated MAC layer."
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [local/classFiles "1"]]
  :aot [final_project.MyLinkLayer])

该类成功编译("lein compile")到“target/classes/final_project/”,但方法未显示。我可以通过jar加载类(在我的项目顶部Java部分使用Maven导入包工作得很好)。我甚至使用Eclipse检查了.class文件,唯一生成的方法是Object中的方法。有什么想法吗?此外,一旦我真正进入Clojure类的“有状态”部分,有人有任何想法吗?提前感谢。

他们真的让你在课堂上使用Clojure吗?该死,这里总是坚持使用Java(好吧,公平地说,现在有这么多JVM语言,你不能真正允许一个班级使用所有这些语言而不陷入混乱)。 - Cubic
是的。这很令人兴奋,但由于这对我的教授来说是如此冒险和实验性的,如果其他人有机会使用它,我基本上必须让它看起来很容易。这就是我犹豫采用下面的Maven解决方案的部分原因。Leiningen要好得多。 - kwenholz
1个回答

2
当我编写同时使用Clojure和Java的项目时,通常会使用Maven而不是Leiningen - 简单地说,大多数Java工具(例如Eclipse)目前更了解Maven而不是Leiningen。
以下是我用于混合Clojure / Java项目的示例pom.xml: 请注意以下关键特征:
  • 使用clojure-maven-plugin
  • 配置Clojure源目录以被视为资源 - 这确保.clj文件被视为资源,在任何生成的.jar文件中打包,并可以在运行时动态加载(这可能解决Java无法识别.clj文件的问题)
  • 将clojars.org包含为存储库 - 对于严肃的Clojure开发来说几乎是必不可少的!

谢谢你的帮助。有没有一个好的资源可以让我开始这种工作?你的pom.xml有些道理,但我对Maven一窍不通。你知道一个快速学习的好地方吗?Leiningen一直很棒,直到出现这个问题... - kwenholz
你可以通过使用命令行(更复杂,更强大)或使用IDE集成(更容易,尽管您可能需要进入命令行进行更高级的操作)来学习Maven。我个人是通过使用Eclipse的IDE路线学习的 - 请参阅http://wiki.eclipse.org/Maven_Integration以获取信息和教程。 - mikera
好的,谢谢。我不是Eclipse的粉丝,所以我会尝试使用命令行。如果我能在Maven下使它工作(听起来应该可以),并且在接下来的几天内无法让Leiningen解决方案工作,那么我会将您的答案标记为正确答案。谢谢! - kwenholz
不幸的是,即使使用Maven,我似乎也无法获得所需的结果。看来我必须将我的Clojure编译为一个jar文件,然后将其与Java代码一起使用。谢谢! - kwenholz
如果你想在一个项目中使用夹心语言,你不应该使用gen-class - 你需要直接从Java中获取Clojure IFns并调用它们。 - MichaelBlume
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接