3

サンプルの多言語プログラムを作成しました。Javaで実装されたセンサーとロボットと、clojureで実装されたAIがあります。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))

ロボット.java:

package clojuretest;

public class Robot {

    public boolean shouldStop() {
        return new AI().isObstacleAhead();
    }
}

手動で maven に強制的にコンパイルさせることもできます: mvn clean clojure:compileエラーが発生します - DistanceSensor クラスがありません (ただし、何らかの理由で AI.class が作成されます)。そのため、 mvn compileAI.class が表示され、すべてが正しくコンパイルされ、テストがパスします。mvn clean compileしかし、合格するにはどうすればよいですか?私のpom.xmlはどのように見えるべきですか? また、Eclipseが存在しないAI.classについて不平を言うのをやめるにはどうすればよいですか?

4

3 に答える 3

2

プロジェクト内のソース コードのレイアウトを変更する必要があります。Clojure Maven プラグインでは、clojure コードが別のディレクトリに移動する必要があるため、次のレイアウトが必要です。

 src/
    main/
      java/
        java-code
      clojure/
        clojure code
    test/
      java/
        java tests code
      clojure/
        clojure tests code

詳細は次の記事で確認できます

于 2013-01-01T13:51:01.223 に答える
1

JavaコードとClojureコードの間には相互依存関係があります。最初にコンパイルするクラスのタイプに関係なく、エラーが発生します。

これは実際の循環依存ではないため、Javaコンパイル部分を2つに分割することでこれを修正できます。

まず、コンパイルしますDistanceSensor。これは他に依存しません。

次に、AIに依存するコンパイルしDistanceSensorます。

Robot最後に、に依存するコンパイルAI

maven-compiler-pluginJavaコンパイルを2つのステップに分割するには、を除外するようにデフォルトの実行を構成し、を除外する目標の後に別の実行を追加する必要 ありRobotます。3つの実行を適切に順序付けるには、フェーズを誤用する必要があります。clujure:compileDistanceSensor

于 2013-01-01T18:25:29.433 に答える
1

:gen-classを使用してJavaコードからそのようなクラスをインスタンス化しようとしているのと同様に、通常はコードの匂いだと思いますnew AI()

この循環依存の問題を解決できる別のアプローチを次に示します。

  1. AIJava コードで Java インターフェイスとして定義する
  2. 次を使用して、インターフェースに準拠したインスタンスを作成する Clojure 関数を作成します。reify
  3. Java から Clojure 関数を動的に呼び出します (たとえば、このブログ投稿で概説されている手法を使用します) 。
  4. これで、Java で好きなように使用できる AI インターフェースのインスタンスができました。

このアプローチの利点は、特に次のように、すべてがスムーズに機能することです。

  • Java コード ベースは、Clojure コードとは別にコンパイルできます。
  • Clojure コード ベースは、定義済みのすべての Java クラスとインターフェイスにアクセスできます。
  • 特別な IDE / Maven 構成は必要ありません。clojure.jar実際、たまたま依存関係として含まれている通常の Java アプリとして扱うことができます。
于 2013-01-02T00:17:24.130 に答える