2014-09-22 4 views
2

이 질문과 같이 간단하게 동일한 디렉토리에서 서로 다른 네임 스페이스에 대해 올바른 방법을 찾을 수 없습니다.ClassNotFoundException 다른 Ns를 사용 중일 때

project_root/src/babbler/core.clj :

(ns babbler.core 
    (:gen-class) 
    (use '[clojure.string :only (join split)])) 

(defn foo [] "Foo") 

다음 project_root/src/babbler/bar.clj : 나는 두 개의 파일이

이 파일은 또한 :main babbler.bar

를 통해 내 project.clj에 지정된 기본 방법을 포함

(ns babbler.bar) 

(use [babbler.core :as babble]) 
내 전체 구조는 기본 leiningen 템플릿으로 반 시계 방향으로 생성됩니다.

Exception in thread "main" java.lang.ClassNotFoundException: babbler.core, compiling:(babbler/bar.clj:3:1) 
    at clojure.lang.Compiler.analyze(Compiler.java:6380) 
    at clojure.lang.Compiler.analyze(Compiler.java:6322) 
    at clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3024) 
    at clojure.lang.Compiler.analyze(Compiler.java:6363) 
    at clojure.lang.Compiler.analyze(Compiler.java:6322) 

(...)

답변

3

use 네임 스페이스의 정의 내부에 있어야합니다 귀하의 :

는 사실
(ns babbler.bar 
    (use [babbler.core :as babble])) 

use

lein repl 실행의 결과는 이것이다 낙담 한 경우 다음과 같이 작성하십시오.

(ns babbler.bar 
    (:require [babbler.core :as babble :refer [foo]])) 

그런 식으로 babbler.core 네임 스페이스에서 임의의 함수 f를 babble/f로 호출 할 수 있으며 foo를 직접 호출 할 수 있습니다. 또한 파일에는 foo의 출처에 대한 정보가 있으므로 사용자 또는 다른 사람이 foo를 검색 할 필요가 없습니다.

+0

(your : require 구문을 사용하여) 다른 오류가 발생하는 것 같습니다. 접두사 목록의 예외 lib 이름에는 마침표가 없어야합니다. 왜 그랬을까요? – FrobberOfBits

+0

을 핵심으로 사용하려면'(: require [clojure.string : refer [join split]])'이 필요합니다. http://stackoverflow.com/questions/9810841/clojure-loading-dependencies-at-the-repl을 참조하십시오. –