Проблема интеграции Clojure и Groovy: зависимости - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь интегрировать код Clojure с Java и Groovy под Intellij в проекте Grails 3.Моя конечная цель - использовать некоторый код Clojure, смешанный с кодом Groovy.

Я написал класс в Groovy и пытаюсь создать его экземпляр в Clojure.Вот что я сделал:

1) Я написал класс app / server / src / main / groovy / mypackage / State.groovy

package mypackage

class State {
   def Calendar date;
   def static State stateBuilder() {
       State state = new State()
       state.date = Calendar.getInstance()
       return state;
   }

2) Затем я написал файл под названием app/server/src/main/clj/state.clj следующим образом:

(ns mypackage.state)

(import mypackage.State)

(def groovystate (new State))

(println (bean groovystate))

(defn -main
  [& args]
  (println "Hello, World!"))

3) Наконец, я написал следующее приложение / server / project.clj

 (defproject brkmopt "0.1.0-SNAPSHOT"
   :description "Test Clojure and Grails integration"
   :url ""
   :plugins [[lein-localrepo "0.5.4"]]
   :license {:name ""
             :url ""}

   :repositories [["bintray-grails-plugins" "https://dl.bintray.com/grails/plugins"]
                  ["java.net" "https://download.java.net/maven/2"]
                  ]

   :dependencies [[org.clojure/clojure "1.9.0"]
                  [org.codehaus.groovy/groovy-all "3.0.0-alpha-4" :extension "pom"]
                  [org.grails/grails-datastore-gorm "6.1.9.RELEASE"]
                  ]

   :main mypackage.state
   :source-paths ["src/main/clj"]
   :java-source-paths ["src/main/java"]
   :test-paths ["src/test/clj"]
   :resource-paths ["resources"]
   :target-path "out/production"
   :aot :all)

Обратите внимание, что ясконфигурировано: target-path to "out / production" и сконфигурировано: зависимости для загрузки некоторых зависимостей. lein не удается найти в проекте Groovy.

Это сработало.Запустив «lein run», я получил:

{:date nil}
Hello, World!

, как и ожидалось.

Но если я заменил:

(def groovystate (new State))

на

(def groovystate (State/stateBuilder))

Компилятор начал запрашивать больше зависимостей, и я провел несколько часов в аду зависимостей, что в итоге привело меня в тупик, требуя зависимости, которую я не смог найти ни в одном репозитории maven.

Последняя версия project.clj:

 (defproject brkmopt "0.1.0-SNAPSHOT"
   :description "Test Clojure and Grails integration"
   :url ""
   :plugins [[lein-localrepo "0.5.4"]]
   :license {:name ""
             :url ""}

   :repositories [["bintray-grails-plugins" "https://dl.bintray.com/grails/plugins"]
                  ["java.net" "https://download.java.net/maven/2"]
                  ;["central"  "https://central.maven.org/maven2/"]
                  ;["sonatype" "https://oss.sonatype.org/content/repositories/releases"]
                  ;["snapshots" "https://blueant.com/archiva/snapshots"]
                  ]

   :dependencies [[org.clojure/clojure "1.9.0"]
                  [org.clojure/data.priority-map "0.0.10"]
                  [com.google.code.gson/gson "2.7"]
                  [org.codehaus.groovy/groovy-all "3.0.0-alpha-4" :extension "pom"]
                  [org.grails/grails-datastore-gorm "6.1.9.RELEASE"]
                  [org.grails.plugins/events "3.3.2"]
                  [org.grails/grails-core "3.3.3"]
                  [org.grails/grails-plugin-domain-class "3.3.3"]
                  [org.grails/grails-web-databinding "3.3.3"]
                  [org.grails/grails-gsp "3.3.1"]
                  ]

   :main mypackage.state
   :source-paths ["src/main/clj"]
   :java-source-paths ["src/main/java"]
   :test-paths ["src/test/clj"]
   :resource-paths ["resources"]
   :target-path "out/production"
   :aot :all)

Я не смог найти grails-gsp версию 3.3.1.Во всяком случае, я уверен, что это не путь.Предполагалось использовать те же библиотеки, которые использует Grails, а не загружать их снова.

Все необходимые зависимости находятся в папке .dr / .gradle /, но я не знаю, как сделать их видимыми для Clojure.

Пожалуйста, сообщите!

---------- РЕДАКТИРОВАТЬ 1 ----------

Как подсказывает Алекс, я включаюДополнительная информация.Я встраиваю код Clojure в проект Grail 3, как показано на рисунке ниже:

enter image description here

Когда это работает (первый случай), я вижу это:

root@linuxkit-025000000001:~/workspace/brkm_app/server# lein run
Compiling com.nitryx.brkmopt.state
{:date nil}
Hello, World!
root@linuxkit-025000000001:~/workspace/brkm_app/server# 

Когда я изменяю на (println (bean (groovystate)) и включаю все зависимости, которые мог, я вижу это:

root@linuxkit-025000000001:~/workspace/brkm_app/server# lein run
Could not find artifact org.grails:grails-gsp:jar:3.3.1 in central (https://repo1.maven.org/maven2/)
Could not find artifact org.grails:grails-gsp:jar:3.3.1 in clojars (https://repo.clojars.org/)
Could not find artifact org.grails:grails-gsp:jar:3.3.1 in bintray-grails-plugins (https://dl.bintray.com/grails/plugins)
Could not find artifact org.grails:grails-gsp:jar:3.3.1 in java.net (https://download.java.net/maven/2)
This could be due to a typo in :dependencies, file system permissions, or network issues.
If you are behind a proxy, try setting the 'http_proxy' environment variable.
root@linuxkit-025000000001:~/workspace/brkm_app/server# 

Grails работает на Gradle. Lein на MavenЯ запускаю его в док-контейнере, и там нет папки .m2.

root@linuxkit-025000000001:~# ls -la
total 20
drwxr-xr-x  1 root root 4096 Feb 16 18:41 .
drwxr-xr-x  1 root root 4096 Feb 12 15:18 ..
drwx------  2 root root 4096 Feb 16 18:41 .cache
drwxr-xr-x  3 root root 4096 Feb 16 16:23 .lein
drwxr-xr-x  1 root root 4096 Feb 12 15:18 .vscode
drwxr-xr-x 15 root root  480 Feb 13 19:42 workspace

root@linuxkit-025000000001:~# cd workspace
root@linuxkit-025000000001:~/workspace# ls -la
total 36
drwxr-xr-x 15 root root  480 Feb 13 19:42 .
drwxr-xr-x  1 root root 4096 Feb 16 18:41 ..
-rw-r--r--  1 root root 6148 Feb 13 19:27 .DS_Store
drwxr-xr-x  9 root root  288 Feb 15 14:08 .dr
drwxr-xr-x 18 root root  576 Feb 16 22:08 .git
-rw-r--r--  1 root root  120 Feb 13 17:42 .gitignore
drwxr-xr-x 13 root root  416 Feb 16 17:09 brkm_app
drwxr-xr-x  4 root root  128 Feb 13 16:53 doc
-rw-r--r--  1 root root  290 Feb 13 18:56 docker-compose.yml
drwxr-xr-x  9 root root  288 Feb 13 19:27 dockerfiles
-rwxr-xr-x  1 root root  994 Feb 13 17:42 run_container_linux.sh
-rwxr-xr-x  1 root root  949 Feb 15 18:47 run_container_mac.sh
-rwxr-xr-x  1 root root   37 Feb 13 17:50 run_idea.sh
-rwxr-xr-x  1 root root   20 Feb 13 17:49 run_visual_studio_code.sh
drwxr-xr-x  8 root root  256 Feb 15 11:51 tests

root@linuxkit-025000000001:~/workspace# cd brkm_app/
root@linuxkit-025000000001:~/workspace/brkm_app# ls -la
total 40
drwxr-xr-x 13 root root   416 Feb 16 17:09 .
drwxr-xr-x 15 root root   480 Feb 13 19:42 ..
-rw-r--r--  1 root root    21 Feb 13 16:53 .gitignore
drwxr-xr-x  4 root root   128 Feb 13 17:37 .gradle
drwxr-xr-x 12 root root   384 Feb 16 22:13 .idea
-rw-r--r--  1 root root   692 Feb 13 17:40 brkm_app.iml
drwxr-xr-x 13 root root   416 Feb 13 16:53 client
drwxr-xr-x  3 root root    96 Feb 13 16:53 gradle
-rwxr-xr-x  1 root root  4971 Feb 13 16:53 gradlew
-rwxr-xr-x  1 root root  2404 Feb 13 16:53 gradlew.bat
-rwxr-xr-x  1 root root 12540 Feb 15 11:51 lein
drwxr-xr-x 16 root root   512 Feb 16 22:08 server
-rw-r--r--  1 root root    26 Feb 13 16:53 settings.gradle

Я нашел зависимости в папке .dr, выполнив команду find. Я не совсем понимаю, почему они есть, икак они используются Grails / Gradle.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я вижу и build.gradle, и project.clj, но вам действительно нужно выбрать один.Поскольку кажется, что вы интегрируетесь в существующий проект Gradle, я бы порекомендовал установить плагин Gradle Clojure: https://github.com/gradle-clojure/gradle-clojure. Не следуйте инструкциям по инструменту clj, просто добавьте его как другой плагин, если вы 'мы делали это раньше.

Это, надеюсь, должно решить любые проблемы с зависимостями, которые у вас есть.Плагин clojure сможет скомпилировать ваш код clojure как часть обычного процесса сборки Gradle.

0 голосов
/ 17 февраля 2019

grails-web-databinding версия 3.3.3 находится в центральном репозитории Maven, который по умолчанию должен быть включен Leiningen.Возможно, было бы хорошо включить вывод, который вы видите, а также список библиотек, которые вы ожидаете использовать для grails.

Лейнинген использует инструменты Maven под капотом и кэширует библиотеки в ~ / .m2 / repository,Я не знаю ни одного способа заставить его использовать deps в папке .dr / .gradle /.

...