динамически добавлять к classpath в clojure repl для доступа к файлам классов java (pomegranate / add-classpath) - PullRequest
0 голосов
/ 28 сентября 2018

Я скомпилировал файлы классов в shortScreen/out/production/classes/com/rsw/ и хочу использовать их в ответной реплике.Я думаю, что зависание на add-classpath, но я не знаю, что должно происходить.Или как это исправить.

(use '[cemerick.pomegranate :only (add-dependencies add-classpath)])
(import 'clojure.pprint)
(def myclasses "shortScreen/out/production/classes/com/rsw/")
; do i have the correct path?
(-> (clojure.java.io/file myclasses) (file-seq) (pprint)) ; shows many class files
(.exists (clojure.java.io/file myclasses "util.class")) ; true

; add the path
(add-classpath myclasses)

; but nothing like myclasses path in list
(def thiscp (.getURLs (java.lang.ClassLoader/getSystemClassLoader)))
(pprint thiscp)
(filter (fn [s] (re-seq #"out" s)) ;myclasses path should match "out"
     (for [x thiscp]
       (.toString x)))

; fails -- but not sure if this is the correct syntax anyway
(import 'com.rsw.util)
(util/msg "test")

Редактировать: Воспроизводимый пример

mkdir example && cd $_
# java code
cat > util.java << EOF
 package com.util;
 public class util {
 public static void msg(String a){
   System.out.println(a);
  }
 }
EOF

# clojure depends
cat > deps.edn << EOF
  {:deps {
    :alembic {:mvn/version "0.3.2"}
    :com.cemerick/pomegranate {:mvn/version "1.0.0"}
    }
  }
EOF

# compile java to class
javac util.java
ls # util.java util.class

# try to load in repl
clj

  (use '[cemerick.pomegranate :only (add-dependencies add-classpath)])
  (add-classpath (-> (java.io.File. ".") .getAbsolutePath))
  (import 'com.util.util)
  ; ClassNotFoundException com.util  java.net.URLClassLoader.findClass (URLClassLoader.java:381)
...