[英]java mixed with clojure in maven and eclipse
我创建了一个样本多语言程序。 我有一个传感器和一个用java和AI实现的机器人在clojure中实现。 我无法正确连接maven
--src/main/java/clojuretest
|
DistanceSensor.java
AI.clj (uses DistanceSensor)
Robot.java (uses AI)
DistanceSensor.java:
package clojuretest;
public class DistanceSensor {
public int getValue() {return 5;}
}
AI.clj:
(ns clojuretest.AI
(:gen-class :methods [[isObstacleAhead [] boolean]]))
(defn -isObstacleAhead [this] (< (.getValue (clojuretest.DistanceSensor.)) 10))
Robot.java:
package clojuretest;
public class Robot {
public boolean shouldStop() {
return new AI().isObstacleAhead();
}
}
我甚至可以手动强制maven编译它: mvn clean clojure:compile
产生错误 - 没有DistanceSensor类(但由于某种原因创建了AI.class)。 所以然后mvn compile
看到AI.class并正确编译所有内容并测试通过。 但是我能做些什么来使mvn clean compile
通过? 我的pom.xml应该怎么样? 还有什么办法可以让eclipse停止抱怨不存在的AI.class?
您需要更改项目中源代码的布局。 Clojure maven插件需要,clojure代码进入单独的目录,所以你应该有以下布局:
src/
main/
java/
java-code
clojure/
clojure code
test/
java/
java tests code
clojure/
clojure tests code
您可以在以下文章中找到更多详细信息
您在Java代码和Clojure代码之间存在相互依赖关系。 无论你先编译哪种类,都会出错。
由于它不是一个实际的循环依赖,你仍然可以通过将Java编译部分分成两部分来解决这个问题。
首先,编译DistanceSensor
,它不依赖于任何其他东西。
其次,编译AI
,这取决于DistanceSensor
。
最后,编译依赖AI
Robot
。
要分两步拆分java编译,您需要配置maven-compiler-plugin
的默认执行,以便它排除 Robot
,并在clujure:compile
目标之后添加另一个执行,该目标排除DistanceSensor
。 你可能不得不滥用阶段来正确地命令三个执行。
我认为:gen-class
通常是代码气味,试图用new AI()
从Java代码实例化这样的类。
这是一种可以解决循环依赖性问题的替代方法:
AI
定义为Java代码中的Java接口 reify
创建符合接口的实例 这种方法的优点是一切都能顺利进行,特别是:
clojure.jar
作为依赖项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.