簡體   English   中英

如何在Clojure REPL中從Maven項目加載Java類?

[英]How to load java classes from maven project in a Clojure REPL?

有誰知道在Clojure REPL中從Maven項目加載Java類的簡便方法?

我看了看lein文檔,他們似乎不支持Maven。

clojure-maven-plugin提供了clojure:repl目標,但它似乎只是加載項目的依賴項,而不是src / main / java中的類。

理想情況下,我不願意僅為此任務設置一個lein項目,因為我只想嘗試一下項目中擁有的一些Java類。

任何人?

lein支持從maven lein依賴項。 實際上,這是中央lein功能之一(如果不是)。

您可以使用pallet/alembic從repl運行時獲取和加載maven依賴項。

由於~/.lein/profiles.clj包含以下內容,因此我有可用的托盤~/.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"]]}}

這意味着我可以從任何REPL使用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存儲庫使用的大多數任何Class。

在您的特定情況下,您可以通過maven在本地安裝Java項目,然后使用alembic將其加載到repl中進行實驗。

事實證明,建立一個lein項目比我想的要簡單。

要將類加載到REPL上,我只需要:

1.使用myproject作為依賴項創建一個project.clj文件:

(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 ,它將所有依賴項捆綁到mvn install生成的jar中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM