簡體   English   中英

java在maven和eclipse中混合了clojure

[英]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代碼實例化這樣的類。

這是一種可以解決循環依賴性問題的替代方法:

  1. AI定義為Java代碼中的Java接口
  2. 編寫Clojure函數以使用reify創建符合接口的實例
  3. 從Java動態調用Clojure函數(例如,使用本博文中概述的技術)
  4. 您現在擁有了一個可以在Java中使用的AI接口實例

這種方法的優點是一切都能順利進行,特別是:

  • Java代碼庫可以獨立於Clojure代碼進行編譯
  • Clojure代碼庫可以訪問所有已定義的Java類和接口
  • 您不需要任何特殊的IDE / Maven配置。 實際上,您可以將其視為一個普通的Java應用程序,恰好包含clojure.jar作為依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM