Промежуточное ПО Nrepl не загружается правильно с проектом maven

Я пытаюсь использовать отладчик CIDER в своем проекте, который настроен в maven (не могу переключиться на Leiningen). Я настроил clojure-maven-plugin, как указано в их github README:

<plugin>
  <groupId>com.theoryinpractise</groupId>
  <artifactId>clojure-maven-plugin</artifactId>
  <version>1.8.1</version>
  <extensions>true</extensions>
  <executions>
    <execution>
      <id>clojure-compile</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
    </execution>
    <execution>
      <id>clojure-test</id>
      <phase>test</phase>
      <goals>
        <goal>test</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <nreplMiddlewares>
      <middleware>cider.nrepl.middleware.apropos/wrap-apropos</middleware>
      <middleware>cider.nrepl.middleware.classpath/wrap-classpath</middleware>
      <middleware>cider.nrepl.middleware.complete/wrap-complete</middleware>
      <middleware>cider.nrepl.middleware.debug/wrap-debug</middleware>
      <middleware>cider.nrepl.middleware.format/wrap-format</middleware>
      <middleware>cider.nrepl.middleware.info/wrap-info</middleware>
      <middleware>cider.nrepl.middleware.inspect/wrap-inspect</middleware>
      <middleware>cider.nrepl.middleware.macroexpand/wrap-macroexpand</middleware>
      <middleware>cider.nrepl.middleware.ns/wrap-ns</middleware>
      <middleware>cider.nrepl.middleware.pprint/wrap-pprint</middleware>
      <middleware>cider.nrepl.middleware.pprint/wrap-pprint-fn</middleware>
      <middleware>cider.nrepl.middleware.refresh/wrap-refresh</middleware>
      <middleware>cider.nrepl.middleware.resource/wrap-resource</middleware>
      <middleware>cider.nrepl.middleware.stacktrace/wrap-stacktrace</middleware>
      <middleware>cider.nrepl.middleware.test/wrap-test</middleware>
      <middleware>cider.nrepl.middleware.trace/wrap-trace</middleware>
      <middleware>cider.nrepl.middleware.out/wrap-out</middleware>
      <middleware>cider.nrepl.middleware.undef/wrap-undef</middleware>
      <middleware>cider.nrepl.middleware.version/wrap-version</middleware>
    </nreplMiddlewares>
    <sourceDirectories>
      <sourceDirectory>src/main/clojure</sourceDirectory>
    </sourceDirectories>
    <namespaces>
      <namespace>!edu.upc.modelvsdocument.repl.*</namespace>
      <namespace>edu.upc.modelvsdocument.*</namespace>
    </namespaces>
    <!--<warnOnReflection>true</warnOnReflection>-->
  </configuration>
</plugin>

И добавил зависимости:

<dependencies>
  <dependency>
    <groupId>org.clojure</groupId>
    <artifactId>tools.nrepl</artifactId>
    <version>0.2.12</version>
  </dependency>
  <dependency>
    <groupId>cider</groupId>
    <artifactId>cider-nrepl</artifactId>
    <version>0.14.0-SNAPSHOT</version>
  </dependency>
  <!-- ... -->
</dependencies>

Обратите внимание, что моя версия сидра - это точно 0.14.0-SNAPSHOT.

С этой конфигурацией я запускаю сервер nREPL, используя

$ mvn clojure:nrepl

И с этим я могу подключиться из emacs, используя cider-connect.

С такой настройкой я могу делать много вещей, например загружать пространства имен и использовать REPL, но когда дело доходит до функций промежуточного программного обеспечения, таких как отладчик, я получаю всевозможные ошибки, связанные с несвязанными функциями или переменными. В случае отладчика:

clojure.lang.LispReader$ReaderException: java.lang.IllegalStateException: Attempting to call unbound fn: #'cider.nrepl.middleware.debug/debug-reader
 at clojure.lang.LispReader.read (LispReader.java:294)
    clojure.lang.LispReader.read (LispReader.java:198)
    clojure.lang.LispReader.read (LispReader.java:187)
    clojure.core$read.invokeStatic (core.clj:3747)
    clojure.core$read.invoke (core.clj:3720)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__681$fn__684.invoke (interruptible_eval.clj:98)
    clojure.main$repl$read_eval_print__9594$fn__9595.invoke (main.clj:238)
    clojure.main$repl$read_eval_print__9594.invoke (main.clj:238)
    clojure.main$repl$fn__9603.invoke (main.clj:258)
    clojure.main$repl.invokeStatic (main.clj:258)
    clojure.main$repl.doInvoke (main.clj:174)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__681.invoke (interruptible_eval.clj:87)
    clojure.lang.AFn.applyToHelper (AFn.java:152)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invokeStatic (core.clj:657)
    clojure.core$with_bindings_STAR_.invokeStatic (core.clj:1962)
    clojure.core$with_bindings_STAR_.doInvoke (core.clj:1962)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:85)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:55)
    clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__726$fn__729.invoke (interruptible_eval.clj:222)
    clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__721.invoke (interruptible_eval.clj:190)
    clojure.lang.AFn.run (AFn.java:22)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    java.lang.Thread.run (Thread.java:745)
Caused by: java.lang.IllegalStateException: Attempting to call unbound fn: #'cider.nrepl.middleware.debug/debug-reader
 at clojure.lang.Var$Unbound.throwArity (Var.java:43)
    clojure.lang.AFn.invoke (AFn.java:32)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.LispReader$CtorReader.readTagged (LispReader.java:1351)
    clojure.lang.LispReader$CtorReader.invoke (LispReader.java:1330)
    clojure.lang.LispReader$DispatchReader.invoke (LispReader.java:786)
    clojure.lang.LispReader.read (LispReader.java:265)
    clojure.lang.LispReader.read (LispReader.java:198)
    clojure.lang.LispReader.read (LispReader.java:187)
    clojure.core$read.invokeStatic (core.clj:3747)
    clojure.core$read.invoke (core.clj:3720)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__681$fn__684.invoke (interruptible_eval.clj:98)
    clojure.main$repl$read_eval_print__9594$fn__9595.invoke (main.clj:238)
    clojure.main$repl$read_eval_print__9594.invoke (main.clj:238)
    clojure.main$repl$fn__9603.invoke (main.clj:258)
    clojure.main$repl.invokeStatic (main.clj:258)
    clojure.main$repl.doInvoke (main.clj:174)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__681.invoke (interruptible_eval.clj:87)
    clojure.lang.AFn.applyToHelper (AFn.java:152)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invokeStatic (core.clj:657)
    clojure.core$with_bindings_STAR_.invokeStatic (core.clj:1962)
    clojure.core$with_bindings_STAR_.doInvoke (core.clj:1962)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:85)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:55)
    clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__726$fn__729.invoke (interruptible_eval.clj:222)
    clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__721.invoke (interruptible_eval.clj:190)
    clojure.lang.AFn.run (AFn.java:22)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    java.lang.Thread.run (Thread.java:745)

Обратите внимание, что при использовании leiningen с cider-jack-in зависимости правильно вводятся nREPL, и я могу использовать отладчик. Если я использую cider-connect для lein repl, у меня возникают такие же проблемы, но я никогда не настраивал leiningen для загрузки промежуточного программного обеспечения nREPL. Это наводит меня на мысль, что промежуточное ПО также не инициализируется в случае maven (хотя и указано).

Что мне не хватает в моей конфигурации, чтобы это работало?


person Setzer22    schedule 14.10.2016    source источник


Ответы (1)


Я сам нашел ответ в системе отслеживания проблем clojure-maven-plugin: https://github.com/talios/clojure-maven-plugin/pull/87

Кажется, этого недостаточно, добавив конфигурацию nreplMiddlewares, вам все равно нужно передать обработчик nrepl при запуске сервера nrepl. Я так делаю:

$ mvn clojure:nrepl -Dclojure.nrepl.handler=cider.nrepl/cider-nrepl-handler

Теперь сидр работает так, как ожидалось, и я могу использовать отладчик.

person Setzer22    schedule 14.10.2016
comment
Вы можете добавить значение для clojure.nrepl.handler в элемент properties верхнего уровня вашего файла pom.xml вместо того, чтобы передавать его через -D при каждом вызове. - person semperos; 26.12.2017