java - 引用从 Clojure 文件生成的类的 Java 文件的 Leiningen 编译错误

标签 java compilation clojure interop leiningen

我有一个正在编译 Java 和 Clojure 文件的 Leiningen 项目。 Java 文件导入一些从 Clojure 文件生成的类(使用 gen-class)。

当我进行 lein 编译时,我在 Java 文件中的导入中遇到编译错误(说它找不到类)。如果我从项目中删除 Java 文件,执行 lein 编译,重新添加 Java 文件,然后再次执行 lein 编译,一切正常。

所以,就像 Clojure 文件需要在 Java 文件之前编译一样。

顺便说一句,我在 :aot 列表中包含生成类的 Clojure 文件。

这里出了什么问题?

最佳答案

(此答案中的代码未经测试,但它应该有望与 Leiningen 1.x 一起使用(对于 x 的最新值)。)

莱宁根的 compile任务运行 javac如果您的 project.clj 会自动执行任务指定 :java-source-path .它在编译 Clojure 源代码之前这样做,因为我认为这是依赖项的通常方向。

要解决这个问题,您可以使用钩子(Hook):

;;; in leiningen.hooks.clj_first.clj

(ns leiningen.hooks.clj-first
  (:require [leiningen.compile :as leinc]
            [leiningen.javac :as javac]))

(defn compile-clj-first-hook [compile-task project & args]
  (apply compile-task
         (dissoc project :java-source-path)
         args))
  (javac/javac project))

(add-hook #'leiningen.compile/compile compile-clj-first-hook)

将它放在构建时类路径的某处并添加

:hooks [clj-first-hook]

到您的项目 map 。

请注意 javac , 当直接调用时,仍然不会调用 compile .你也可以让它等同于 compile例如通过使用以下函数 Hook 它:

(defn javac-hook [javac-task project]
  (if (project ::clj-compiled?)
    (javac/javac project)
    (leinc/compile project)))

compile-clj-first-hook 的最后一种形式然后需要

(javac/javac (assoc project ::clj-compiled? true))

(使 compile 调用 javac 可能会破坏 jar/uberjar 。)

关于java - 引用从 Clojure 文件生成的类的 Java 文件的 Leiningen 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336202/

相关文章:

java - 大家好,请问一下按下按钮时的声音处理吗?

java - 创建表单 bean 时出错

java - Linux下OpenCV 2.8.4安装进行Java开发

excel - 按需编译已禁用

rest - 学习 Clojure : unable to fix

clojure - :tag metadata clojure

clojure - 在 Clojure 中,宏与函数有何不同?

java - 设计mvc Controller 层

compilation - unistd.h 和 crypt.h 中的 crypt 有什么区别?

java - 如何使用 C++ 编译 .java 文件