2016-06-24 7 views
1

他のファイルで定義されている関数が含まれていない単純なclojureプログラムを実行しようとしています。同じディレクトリ内のファイルを見つけることができません。LeiningenなしでClojureにファイルを含める:ファイルを見つけることができません

helloInclude 
    src 
     main.clj 
     importer.clj 

main.clj

(ns main 
    (:gen-class) 
(:require [importer])) 

(defn -main 
    [& args] 
    (println "Hello, World!")) 

(-main) 
(println (func 5 6)) 

importer.cljでsrcディレクトリ内から実行

(ns importer 
    (:gen-class)) 

(defn func 
    [a b] 
    (+ a b 1)) 

java -jar "Path\To\Clojure\clojure-1.8.0\clojure-1.8.0.jar" -i main.clj 

戻り値のエラー:

java -classpath . -jar "Path\To\Clojure\clojure-1.8.0\clojure-1.8.0.jar" -i main.clj 

が、私はこのためにLeiningenをを使用することができません:

Exception in thread "main" java.io.FileNotFoundException: Could not locate importer__init.class or importer.clj on classpath., compiling:(C:\Users\jamesjenkinson\Clojure\helloInclude\src\main.clj:1:1) 
     at clojure.lang.Compiler.load(Compiler.java:7391) 
     at clojure.lang.Compiler.loadFile(Compiler.java:7317) 
     at clojure.main$load_script.invokeStatic(main.clj:275) 
     at clojure.main$init_opt.invokeStatic(main.clj:277) 
     at clojure.main$init_opt.invoke(main.clj:277) 
     at clojure.main$initialize.invokeStatic(main.clj:308) 
     at clojure.main$null_opt.invokeStatic(main.clj:342) 
     at clojure.main$null_opt.invoke(main.clj:339) 
     at clojure.main$main.invokeStatic(main.clj:421) 
     at clojure.main$main.doInvoke(main.clj:384) 
     at clojure.lang.RestFn.invoke(RestFn.java:421) 
     at clojure.lang.Var.invoke(Var.java:383) 
     at clojure.lang.AFn.applyToHelper(AFn.java:156) 
     at clojure.lang.Var.applyTo(Var.java:700) 
     at clojure.main.main(main.java:37) 
Caused by: java.io.FileNotFoundException: Could not locate import__init.class or import.clj on classpath. 
     at clojure.lang.RT.load(RT.java:456) 
     at clojure.lang.RT.load(RT.java:419) 
     at clojure.core$load$fn__5677.invoke(core.clj:5893) 
     at clojure.core$load.invokeStatic(core.clj:5892) 
     at clojure.core$load.doInvoke(core.clj:5876) 
     at clojure.lang.RestFn.invoke(RestFn.java:408) 
     at clojure.core$load_one.invokeStatic(core.clj:5697) 
     at clojure.core$load_one.invoke(core.clj:5692) 
     at clojure.core$load_lib$fn__5626.invoke(core.clj:5737) 
     at clojure.core$load_lib.invokeStatic(core.clj:5736) 
     at clojure.core$load_lib.doInvoke(core.clj:5717) 
     at clojure.lang.RestFn.applyTo(RestFn.java:142) 
     at clojure.core$apply.invokeStatic(core.clj:648) 
     at clojure.core$load_libs.invokeStatic(core.clj:5774) 
     at clojure.core$load_libs.doInvoke(core.clj:5758) 
     at clojure.lang.RestFn.applyTo(RestFn.java:137) 
     at clojure.core$apply.invokeStatic(core.clj:648) 
     at clojure.core$require.invokeStatic(core.clj:5796) 
     at clojure.core$require.doInvoke(core.clj:5796) 
     at clojure.lang.RestFn.invoke(RestFn.java:408) 
     at src.main$eval3$loading__5569__auto____4.invoke(main.clj:1) 
     at src.main$eval3.invokeStatic(main.clj:1) 
     at src.main$eval3.invoke(main.clj:1) 
     at clojure.lang.Compiler.eval(Compiler.java:6927) 
     at clojure.lang.Compiler.eval(Compiler.java:6916) 
     at clojure.lang.Compiler.load(Compiler.java:7379) 
     ... 14 more 

はまた、現在のディレクトリであることを明示的に呼び出すクラスパスを試してみました。ファイルを正しく参照するにはどうすればよいですか?

編集: 名前空間をトップレベルに変更しました。

+1

「src」を削除してみます。両方の名前空間の宣言から。 (srcがルートフォルダの場合)else "helloInclude"がrootの場合は '(require [import])'を '(require [src.import])'に書き換えます – leetwinski

+0

srcはルートフォルダです。両方の宣言から 'src'を削除しても、まだ動作しません。 –

+0

あなたの名前空間構文が間違っています。 main: '(ns main(:gen-class)(:require [import]))'、import: '(ns import(:gen-class))'のように書き直してください。また、私は何かに 'import 'の名前を変更します。すでに' import'があるからです。 – leetwinski

答えて

0

requireは、クラスパスの下にあるファイルのみを検索します。 requireを使用できるようにするには、クラスパスに対するコードへのパスが、名前空間のパッケージと名前と一致しなければなりません。 -cp java to argはクラスパスにディレクトリを追加することができ、現在のディレクトリはではなく、暗黙のうちにクラスパスにです。

ファイルがちょうどimportの場合、ファイルは最上位ディレクトリに直接存在しなければならず、そのパッケージは最上位の名前空間になるように変更する必要があります。現在の場所とパッケージで要求するには、importの代わりにsrc.importを使用する必要があります。

また、最上位の名前空間は推奨されません。

最後に、-mainを実行する適切なオプションは-mです。

+$ ls 
import.clj main.clj 
+$ cat import.clj 
(ns import) 

(defn foo 
    [] 
    (println "hello")) 
+$ cat main.clj 
(ns main 
    (:require [import]) 
    (:gen-class)) 

(defn -main 
    [& args] 
    (import/foo)) 
:$ java -cp ~/bin/clojure.jar:. clojure.main -m main 
hello 
+0

これは 'src'フォルダから実行されています。私は '.src'を削除するために名前空間を変更しましたが、まだ運がありません。 –

+0

また、 'src'にmainを持ち、親にmainを持ち、適切な名前空間で親フォルダから実行しようとしました。また、ファイルを見つけることができません。 –

+0

また、ファイル名は名前空間と一致する必要があります.nsが 'import'の場合、ファイルは' import.clj'ではなく 'importer 'でなければなりません。clj' – noisesmith

関連する問題