2017-09-03 49 views
1

定義在我們的Clojure代碼庫的實現,我們有一個協議:雷音uberjar找不到DEFTYPE

(ns project.repository) 

(defprotocol Repository 
    (index [this fields unique])) 

A型

(ns project.mongo (:require 
    [monger.collection :as mc] 
    [monger.core :as mg] 
    [project.repository :refer :all])) 

(deftype MongoRepository [db collection-name] 
    Repository 
    (index [this fields unique] 
    (mc/ensure-index db collection-name fields {:unique unique}))) 

(defn mongo-repository [db coll] (MongoRepository. db coll)) 

(def mongo-db ((mg/connect-via-uri "mongodb://127.0.0.1/bots") :db)) 

而一個實例

(ns project.users (:require 
    [lp-bots.storages.repository :refer :all] 
    [lp-bots.storages.mongo :refer [mongo-repository mongo-db]])) 

(def users-storage (mongo-repository mongo-db "users")) 
(index users-storage [:key1 :key2] true) 

這工作正常當從REPL交互使用或與lein run一起發射時,但lein uberjar總是thro WS異常:

Exception in thread "main" java.lang.ExceptionInInitializerError, compiling:(/tmp/form-init118199196859405970.clj:1:72) 
    ... 
Caused by: java.lang.ExceptionInInitializerError 
    ... 
Caused by: java.lang.IllegalArgumentException: No implementation of method: :index of protocol: #'project.repository/Repository found for class: project.mongo.MongoRepository 
    at clojure.core$_cache_protocol_fn.invokeStatic(core_deftype.clj:568) 
    at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:560) 
    at project.repository$fn__557$G__514__566.invoke(repository.clj) 
    at project.users__init.load(Unknown Source) 
    at project.users__init.<clinit>(Unknown Source) 

最奇怪的是,問題消失時(index)被稱爲在(let)

(def users-storage 
    (let [u (mongo-repository mongo-db "leads")] 
    (index u [:key1 :key2] true) 
    u)) 

上什麼可能導致的差異有什麼想法?

+0

你嘗試做AOT編譯與雷音uberjar? –

+0

@akond是的!當將代碼複製並粘貼到問題中時,這需要丟失。修復了這個問題。 – 0x60

+0

@minhtuannguyen這就是我們正在做的。我們有:aot:all在project.clj中,異常在aot編譯期間被拋出。 – 0x60

回答

0

我會懷疑這是在編譯project.mongo ns或project.users ns時嘗試連接到MongoDB。這些線大概應該是在一個函數調用這就是所謂的啓動,而不是作爲加載代碼:

(def mongo-db ((mg/connect-via-uri "mongodb://127.0.0.1/bots") :db)) 

(index users-storage [:key1 :key2] true)