[英]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.