Leiningen:只编译修改过的java源文件

Leiningen:只编译修改过的java源文件,java,clojure,compilation,leiningen,Java,Clojure,Compilation,Leiningen,我正在使用leiningen的:java源代码路径,它每次都在编译java源代码。有没有办法让莱恩知道它是否没有改变 下面是一个示例项目来说明这个问题:看起来Clojure和Java源代码混合在同一个源代码树中,然后将:Java源代码路径指向该源代码树根目录的子目录。polyglot项目更典型的方法是为每种语言的源代码管理单独的目录 每次调用lein时都会看到Java源代码重新编译的原因是,只有当:Java源代码路径指向Java包树的根时,检测过时Java源代码的检查才有效。请注意,javac任

我正在使用leiningen的:java源代码路径,它每次都在编译java源代码。有没有办法让莱恩知道它是否没有改变


下面是一个示例项目来说明这个问题:

看起来Clojure和Java源代码混合在同一个源代码树中,然后将
:Java源代码路径
指向该源代码树根目录的子目录。polyglot项目更典型的方法是为每种语言的源代码管理单独的目录

每次调用
lein
时都会看到Java源代码重新编译的原因是,只有当
:Java源代码路径
指向Java包树的根时,检测过时Java源代码的检查才有效。请注意,javac任务中的获取每个源文件相对于
:java源路径
目录的路径,并使用该路径构造对应类文件相对于
:编译路径
目录的路径。在您的例子中,当实际编译的类文件是
target/classes/main/java/TestClass.class
时,Leiningen希望找到
target/classes/TestClass.class

我可以通过将示例项目切换到以下目录结构来修复它:

$ find src
src
src/java
src/java/main
src/java/main/java
src/java/main/java/TestClass.java
src/clj
src/clj/leinwithjava
src/clj/leinwithjava/core.clj
project.clj
中:

:source-paths ["src/clj"]
:java-source-paths ["src/java"]

您使用的是哪种lein版本?最新版本应该根据编译的类文件检查源文件的时间戳。我使用的是Java 1.6.0_51 Java HotSpot(TM)64位服务器VM上最新的Leiningen 2.3.2。是
javac
中仅选择已更改的源文件的代码。仍然存在此问题,因此我创建了一个简单的示例来说明它-刚刚启动了一个空白的lein项目并添加了一个java源代码。很抱歉不清楚。我认为leiningen的行为在决定重新编译时考虑的不仅仅是Java文件是不正确的。你得到了我的支持你得到了我的赏金。虽然我在以这种方式设置实际项目时遇到了第二个小问题——当我运行
lein run
时,我收到一个错误,说它找不到java类。为了编译java类,我必须首先运行
leinjar
。不幸的是,它与示例项目不相同。有什么想法吗?@Bill问题不在于考虑非Java源文件,而是因为Java源路径没有指向包树的根,所以无法将Java文件与其编译的类文件进行匹配。@yayitswei如果您在project.clj中定义了:prep任务,请确保其中包含javac(默认的准备任务包括javac和compile,但是如果您覆盖它,那么您必须确保包括这些任务)。@Alex感谢您的澄清。