2017-11-23 10 views
0

두 개의 gen-class 지시문이있는 Clojure 라이브러리가 있습니다. lein run을 실행할 때 문제가 없습니다. 내가 lein uberjar 실행할 때, 나는 오류를 얻을 : 생성 된 자바 파일에 추가: Clojure 클래스 : java.lang.ClassNotFoundException

$ lein uberjar 
Compiling 6 source files to /Users/frank/src/user/target/uberjar/classes 
Compiling user.common 
Compiling user.core 
java.lang.ClassNotFoundException: user.server.UserAuthenticationServer, compiling:(user/core.clj:15:30) 
Exception in thread "main" java.lang.ClassNotFoundException: user.server.UserAuthenticationServer, compiling:(user/core.clj:15:30) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6926) 
..... 
    at clojure.lang.Compiler.analyze(Compiler.java:6701) 
Caused by: java.lang.ClassNotFoundException: user.server.UserAuthenticationServer 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
... 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6919) 
    ... 86 more 

에서, project.clj, server.cljcore.clj있다.

project.clj

(defproject user "0.1.0-SNAPSHOT" 
    :dependencies [[org.clojure/clojure      "1.9.0-alpha14"] 
       [io.grpc/grpc-core       "1.7.0"] 
       [io.grpc/grpc-netty       "1.7.0" 
        :exclusions [io.grpc/grpc-core]] 
       [io.grpc/grpc-protobuf      "1.7.0"] 
       [io.grpc/grpc-stub       "1.7.0"]] 
    :main ^:skip-aot user.core 
    :aot [user.server] 
    :target-path "target/%s" 
    :source-paths ["src/clj"] 
    :java-source-paths ["src/generated/proto" 
         "src/generated/grpc"] 
    :profiles {:uberjar {:aot :all}}) 

core.clj

(ns user.core 
    (:import [io.grpc Server ServerBuilder]) 
    (:gen-class)) 

(defonce start-server-atom (atom nil)) 
(def port     8080) 

(defn start-server [] 
    (when-not @start-server-atom 
    (reset! start-server-atom 
      (-> (ServerBuilder/forPort port) 
       (.addService (new user.server.UserAuthenticationServer)) 
       .build 
       .start 
       .awaitTermination)))) 

(defn -main 
    [& args] 
    (start-server)) 

server.clj

(ns user.server 
    (:gen-class 
    :main false 
    :name user.server.UserAuthenticationServer 
    :extends xyz.skroo.user.UserAuthenticationGrpc$UserAuthenticationImplBase)) 

(defn -startUserAuthentication [this req res] 
    (.onNext res req) 
    (.onCompleted res)) 

그것은이 w 때문에 이상해 컴파일 타임 순서가 바뀌었고 이제는 독립 실행 형 병을 생성 할 수 없다고 생각합니다.

답변

2

: profiles {: uberjar {: aot : all}}은 uberjar를 실행할 때 모든 네임 스페이스를 컴파일하려고 시도한다는 것을 의미합니다. Lein을 실행하면 : aot 키의 네임 스페이스 만 컴파일됩니다.

uberjar 프로파일을 업데이트하여 서버 네임 스페이스 만 확인하고 작동하는지 확인하십시오.

그렇지 않은 경우 나에게 메시지를 보내면 더 깊이 파고 들어갑니다.

+0

그게 효과가 있습니다! uberjar aot 벡터에'user.core'와'user.server'를 추가했습니다. – frank