Как загрузить Java-классы из проекта Maven в Clojure REPL?
Кто-нибудь знает простой способ загрузки классов Java из проекта Maven в Clojure REPL?
Я взглянул на документы lein, и они, похоже, не поддерживают Maven.
Clojure-maven-plugin предоставляет цель clojure: repl, но, похоже, он просто загружает зависимости проекта, а не классы в моем src / main / java.
В идеале я не хотел бы настраивать проект lein только для этой задачи, так как я просто хочу поиграть с некоторыми классами Java, которые есть в моем проекте.
Кто-нибудь?
2 ответа
lein
поддерживает требующие зависимости от maven
РЕПО. На самом деле это один из, если не центральный lein
особенность.
Ты можешь использовать pallet/alembic
приобрести и загрузить maven
зависимости являются временем выполнения из репл.
Я имею паллет / алембик доступный из-за следующего содержания в моем ~/.lein/profiles.clj
{:user
{:dependencies [[clojure-complete "0.2.3"]
[lein-pdo "0.1.1"]
[criterium "0.4.2"]
[org.clojure/tools.trace "0.7.6"]
[alembic "0.2.0"]]}}
это означает, что я могу использовать Alembic из любого репло
user> (require '[alembic.still :as still])
nil
user> (org.apache.giraph.GiraphRunner.) ; create a new GiraphRunner
CompilerException java.lang.ClassNotFoundException: org.apache.giraph.GiraphRunner, compiling:(/tmp/form-init5282725623346658314.clj:1:50)
К сожалению, у меня нет этого класса
user> (still/distill '[[org.apache.giraph/giraph-core "1.0.0"]] :repositories [["apache" "http://obelix.ics.uci.edu/nexus/content/groups/hyracks-public-releases"]])
WARN: com.google.guava/guava version 12.0 requested, but 14.0.1 already on classpath.
Loaded dependencies:
[[commons-cli "1.2"]
[commons-io "2.1"]
[jline "0.9.94"]
[junit "3.8.1"]
[log4j "1.2.15"]
[com.google.code.findbugs/jsr305 "1.3.9"]
[com.yammer.metrics/metrics-core
"2.2.0"
:exclusions
[[org.slf4j/slf4j-api]]]
[io.netty/netty "3.5.3.Final"]
[it.unimi.dsi/fastutil "6.5.3"]
[javax.activation/activation "1.1"]
[javax.mail/mail "1.4"]
[net.iharder/base64 "2.3.8"]
[org.apache.giraph/giraph-core "1.0.0"]
[org.apache.zookeeper/zookeeper
"3.3.3"
:exclusions
[[com.sun.jmx/jmxri] [com.sun.jdmk/jmxtools] [javax.jms/jms]]]
[org.codehaus.jackson/jackson-core-asl "1.8.0"]
[org.codehaus.jackson/jackson-mapper-asl "1.8.0"]
[org.json/json "20090211"]
[org.slf4j/slf4j-api "1.7.2"]
[org.slf4j/slf4j-log4j12 "1.7.2"]]
Dependencies not loaded due to conflict with previous jars :
[[com.google.guava/guava "12.0"]]
nil
Хорошо, теперь у нас есть жираф
user> (org.apache.giraph.GiraphRunner.) ; create a new GiraphRunner
CompilerException java.lang.NoClassDefFoundError: org/apache/hadoop/util/Tool, compiling:(/tmp/form-init5282725623346658314.clj:1:50)
user> (still/distill '[[org.apache.hadoop/hadoop-core "0.20.2"]])
WARN: commons-logging version 1.0.3 requested, but 1.1.1 already on classpath.
WARN: commons-codec version 1.3 requested, but 1.6 already on classpath.
Loaded dependencies:
[[ant "1.6.5"]
[commons-cli "1.2"]
[commons-el "1.0"]
[commons-httpclient "3.0.1"]
[commons-net "1.4.1"]
[hsqldb "1.8.0.10"]
[junit "4.5"]
[oro "2.0.8"]
[xmlenc "0.52"]
[net.java.dev.jets3t/jets3t "0.7.1"]
[net.sf.kosmosfs/kfs "0.3"]
[org.apache.hadoop/hadoop-core "0.20.2"]
[org.eclipse.jdt/core "3.1.1"]
[org.mortbay.jetty/jetty "6.1.14"]
[org.mortbay.jetty/jetty-util "6.1.14"]
[org.mortbay.jetty/jsp-2.1 "6.1.14"]
[org.mortbay.jetty/jsp-api-2.1 "6.1.14"]
[org.mortbay.jetty/servlet-api-2.5 "6.1.14"]
[tomcat/jasper-compiler "5.5.12"]
[tomcat/jasper-runtime "5.5.12"]]
Dependencies not loaded due to conflict with previous jars :
[[commons-codec "1.3"] [commons-logging "1.0.3"]]
nil
user> (org.apache.giraph.GiraphRunner.) ; create a new GiraphRunner
#<GiraphRunner org.apache.giraph.GiraphRunner@2dbfe923>
user> (bean *1)
{:conf nil, :class org.apache.giraph.GiraphRunner}
поэтому, после получения необходимых зависимостей, мы можем создать и поэкспериментировать с большинством любых классов, доступных через maven
репозиторий.
В вашем конкретном случае вы можете установить свой Java-проект локально через maven
затем используйте alembic
загрузить его в реплей для экспериментов.
Оказывается, настроить проект lein проще, чем я думал.
Чтобы загрузить мои уроки на REPL, мне просто нужно было:
1. создать файл project.clj с myproject
как зависимость:
(defproject test "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [
[org.clojure/clojure "1.6.0"]
[com.mycompany/myproject "0.0.1-SNAPSHOT"]
]
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})
2. установить мой проект на локальный репозиторий Maven:
$ mvn install
3. запустить ответ
$ lein repl
4. импортировать любой класс Java из моего проекта
(import 'com.myproject.MyFile)
ВАЖНО: Это сработало, потому что мой проект maven использует плагин maven-shade-plugin, который объединяет все зависимости в jar-файл, сгенерированный mvn install
,