当前位置: 首页 > 知识库问答 >
问题:

如何在clojure/leiningen中要求java类

胡永逸
2023-03-14

我正在测试Clojure/Java互操作。我创建了一个新的Leiningen项目并创建了这个项目。clj文件以及我将使用的几个依赖项:

    (defproject kente "0.1.0-SNAPSHOT"
      :description "FIXME: write description"
      :url "http://example.com/FIXME"
      :license {:name "Eclipse Public License"
                :url "http://www.eclipse.org/legal/epl-v10.html"}
      :dependencies [[org.clojure/clojure "1.4.0"]
                     [ring/ring-jetty-adapter "1.0.0-RC1"]
                     [compojure "0.6.5"]
                     [hiccup "0.3.7"]
                     [cheshire "5.0.1"]]
      :java-source-paths ["src/java"]
      :plugins [[lein-ring "0.8.2"]]
      :ring {:handler kente.core/application}
      :main kente.core)

我还包含了“java-Source-路径”列表,并将一个hello.java文件放入src/java目录,如下所示:

public class hello {

    private String msg = "Hello World";

    public String sayHello() {
        return this.msg;
    }

}

然后我创造了这个核心。模板中的clj文件:

    (ns kente.core
      (:require [java/hello]))

    (defn application
      "I don't do a whole lot."
      [x]
      (println x "Hello, World!"))

    (defn -main [] (application "Say: "))

如您所见,我甚至没有在应用程序函数中使用hello java类,我只是需要它,但当我在终端中运行“lein jar”时,我得到了这个堆栈跟踪:

    $ lein jar
    Compiling kente.core
    Exception in thread "main" java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath: , compiling:(core.clj:1)
            at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3387)
            at clojure.lang.Compiler.compile1(Compiler.java:7035)
            at clojure.lang.Compiler.compile1(Compiler.java:7025)
            at clojure.lang.Compiler.compile(Compiler.java:7097)
            at clojure.lang.RT.compile(RT.java:387)
            at clojure.lang.RT.load(RT.java:427)
            at clojure.lang.RT.load(RT.java:400)
            at clojure.core$load$fn__4890.invoke(core.clj:5415)
            at clojure.core$load.doInvoke(core.clj:5414)
            at clojure.lang.RestFn.invoke(RestFn.java:408)
            at clojure.core$load_one.invoke(core.clj:5227)
            at clojure.core$compile$fn__4895.invoke(core.clj:5426)
            at clojure.core$compile.invoke(core.clj:5425)
            at user$eval7.invoke(NO_SOURCE_FILE:1)
            at clojure.lang.Compiler.eval(Compiler.java:6511)
            at clojure.lang.Compiler.eval(Compiler.java:6501)
            at clojure.lang.Compiler.eval(Compiler.java:6477)
            at clojure.core$eval.invoke(core.clj:2797)
            at clojure.main$eval_opt.invoke(main.clj:297)
            at clojure.main$initialize.invoke(main.clj:316)
            at clojure.main$null_opt.invoke(main.clj:349)
            at clojure.main$main.doInvoke(main.clj:427)
            at clojure.lang.RestFn.invoke(RestFn.java:421)
            at clojure.lang.Var.invoke(Var.java:419)
            at clojure.lang.AFn.applyToHelper(AFn.java:163)
            at clojure.lang.Var.applyTo(Var.java:532)
            at clojure.main.main(main.java:37)
    Caused by: java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath:
            at clojure.lang.RT.load(RT.java:432)
            at clojure.lang.RT.load(RT.java:400)
            at clojure.core$load$fn__4890.invoke(core.clj:5415)
            at clojure.core$load.doInvoke(core.clj:5414)
            at clojure.lang.RestFn.invoke(RestFn.java:408)
            at clojure.core$load_one.invoke(core.clj:5227)
            at clojure.core$load_lib.doInvoke(core.clj:5264)
            at clojure.lang.RestFn.applyTo(RestFn.java:142)
            at clojure.core$apply.invoke(core.clj:603)
            at clojure.core$load_libs.doInvoke(core.clj:5298)
            at clojure.lang.RestFn.applyTo(RestFn.java:137)
            at clojure.core$apply.invoke(core.clj:603)
            at clojure.core$require.doInvoke(core.clj:5381)
            at clojure.lang.RestFn.invoke(RestFn.java:408)
            at kente.core$loading__4784__auto__.invoke(core.clj:1)
            at clojure.lang.AFn.applyToHelper(AFn.java:159)
            at clojure.lang.AFn.applyTo(AFn.java:151)
            at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3382)
            ... 26 more

我应该做些什么不同的事情?

共有1个答案

蒯宏达
2023-03-14

看看我的答案,我想这差不多是你想要的:https://stackoverflow.com/a/14014153/6264

提示:

  • 不要使用裸包结构-也许你可以,但它通常会导致不必要的问题
  • Java类被导入,而不是必需的。只有当您不想键入包前缀时才需要导入。
 类似资料:
  • 问题内容: 是否可以使用leiningen在项目中与Clojure一起轻松管理和编译本机Java类? 我的工作水平很低(使用netty nio),并且认为某些管道类实际上在构造代码和性能方面都更容易作为原始Java处理。 问题答案: 在Leiningen教程中有以下声明 对于包含某些Java代码的项目,可以将project.clj中的:java-source- path键设置为包含Java文件的目

  • 对于一个类,我需要编写一些JVM代码,我希望使用Clojure。我让它与软件堆栈的底部一起工作,但我无法使它在位于顶部和底部的GUI层之间工作。我的主要问题是让JavaGUI识别我的Clojure文件。我想使用Leiningen实现这一点,但Java编译解决方案似乎没有考虑到这种互操作。这里的答案似乎正是我所需要的。我不明白该把代码放在哪里等等(只是不够详细)。有人有什么建议吗? 我试着制作一个插

  • Clojure/Leiningen/Eclipse(和Java)newby。我试图让Eclipse加载Clojure/Leiningen项目,但在搜索Lein插件解决方案时,我看到了令人困惑/矛盾的结果。 Eclipse IDE for Java开发者版本:Juno Service Release 2构建id:20130225-0426(Windows 8) 我在中有以下用户配置文件。lein\p

  • 在我的Windows 7(64位)环境中,我有很多可用的JVM: 目前,对于Lighttable/Leiningen(我不知道选择哪一个,以及如何选择),它使用 C:\ProgramFiles(x86)\Java\j2re1。4.2\u 12\bin\client\jvm。动态链接库 但我真的很想试试 D:\programs\Java\jdk1。7.0_45\jre\bin\server\jvm。

  • 当我在LightTable中的repl中键入(clojure版本)时,我会得到作为输出。有没有办法升级到1.6。0? 我假设它正在从Leiningen(我的机器上有2.3.4)绘制Clojure版本,该版本开箱即用1.5.1储存。如何确保Leiningen和LightTable都使用Clojure的最新版本?我谷歌了一下,找不到任何明确的答案。 我确实找到了这个SO问题,但它没有具体解决我的问题。

  • 我对Clojure开发非常陌生,我正在尝试在emacs中处理一些现有的项目。问题是,他们都没有project.clj文件,我也找不到合适的repl。当我,我得到一个工作的repl,但当我试图运行任何命令我得到一个错误说。有关于如何使一个Clojure maven项目与lein repl一起工作的资源吗? 谢谢 编辑:另外,我正在处理的项目是一个嵌套的项目,其中包含多个子项目和它们自己的pom。xm