インストールに続いて、Leiningenでモジュールの依存関係の管理をしたいと思います。今回も、Commons Langにスケープゴートになっていただきましょう。
というわけで、project.cljを修正します。
(defproject hello-lein "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.4.0"] [org.apache.commons/commons-lang3 "3.1"]] :main hello-lein.core)
:dependenciesキーワードに続くベクタに対して、依存関係を追加します。
Githubのチュートリアルによると、ClojarsというところとMavenセントラルリポジトリが利用できるらしいです。
ところで、ClojarsにアクセスするとSSL証明書のエラーが出ましたけど、大丈夫…?
https://clojars.org/
では、ちょこっとプログラムを修正。
(ns hello-lein.core) (import '(org.apache.commons.lang3 StringUtils)) (defn print-hello [] (println (StringUtils/join '("Hello" "Leiningen!!") ", "))) (defn -main "I don't do a whole lot." [& args] (print-hello))
実行。
$ lein run Compiling hello-lein.core Compilation succeeded. Hello, Leiningen!!
動きましたねー。
サードパーティのリポジトリを追加する場合は?:repositoriesキーワードで設定するらしいですが、サンプルを見てね!となっています…。
https://github.com/technomancy/leiningen/blob/preview/sample.project.clj
ここでも、Grapeの時と同じくSeasar2に出てきていただきましょう。
project.cljを修正。
(defproject hello-lein "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.4.0"] [org.apache.commons/commons-lang3 "3.1"] [org.seasar.container/s2-framework "2.4.46"]] :main hello-lein.core :repositories {"The Seasar Foundation Maven2 Repository" "http://maven.seasar.org/maven2"})
ソースも修正。
(ns hello-lein.core) (import '(org.apache.commons.lang3 StringUtils) '(org.seasar.framework.util StringUtil)) (defn print-hello [] (println (StringUtils/join '("Hello" "Leiningen!!") ", ")) (println (str "isEmpty? => " (StringUtil/isEmpty "Hello Leiningen!!")))) (defn -main "I don't do a whole lot." [& args] (print-hello))
実行ー。
$ lein run Could not find artifact org.seasar.container:s2-framework:pom:2.4.46 in central (http://repo1.maven.org/maven2) Could not find artifact org.seasar.container:s2-framework:pom:2.4.46 in clojars (https://clojars.org/repo/) Retrieving org/seasar/container/s2-framework/2.4.46/s2-framework-2.4.46.pom (5k) from http://maven.seasar.org/maven2/ Could not find artifact org.seasar.container:s2-container-project:pom:2.4.46 in central (http://repo1.maven.org/maven2) 〜省略〜 Retrieving org/seasar/container/s2-framework/2.4.46/s2-framework-2.4.46.jar (660k) from http://maven.seasar.org/maven2/ Retrieving ognl/ognl/2.6.9-patch-20090427/ognl-2.6.9-patch-20090427.jar (163k) from http://maven.seasar.org/maven2/ Compiling hello-lein.core Compilation succeeded. Hello, Leiningen!! isEmpty? => false
Mavenセントラルリポジトリ、Clojarsから取得できないことがわかった後は、追加したSeasar2のリポジトリから取得に行っています。
簡単に追加するだけなら
:repositories {"The Seasar Foundation Maven2 Repository" "http://maven.seasar.org/maven2"})
といった名前とURLのペアだけでよいみたいですが、もうちょっと詳細にいろいろ設定できるみたいです。こちらについては、Githubに載っているサンプルをご覧ください。
なお、内部ではMavenのリポジトリ管理の仕組みを使用しているようで、ダウンロードしたファイルは「ユーザホームディレクトリ/.m2/repository」に配置されます。
そして、今度はREPLでも試してみましょう。ソースをもう少し修正。
(ns hello-lein.core) (import '(org.apache.commons.lang3 StringUtils) '(org.seasar.framework.util StringUtil)) (defn print-hello [] (println (StringUtils/join '("Hello" "Leiningen!!") ", ")) (println (str "isEmpty? => " (StringUtil/isEmpty "Hello Leiningen!!")))) (defn commons-join [& args] (StringUtils/join args ", ")) (defn s2-is-empty? [target] (StringUtil/isEmpty target)) (defn -main "I don't do a whole lot." [& args] (print-hello))
commons-join、s2-is-empty?という関数を定義しました。
「lein repl」でREPLを起動して、使ってみます。
$ lein repl Compiling hello-lein.core Compilation succeeded. nREPL server started on port 41012 REPL-y 0.1.0-beta8 Clojure 1.4.0 Exit: Control+D or (exit) or (quit) Commands: (user/help) Docs: (doc function-name-here) (find-doc "part-of-name-here") Source: (source function-name-here) (user/sourcery function-name-here) Javadoc: (javadoc java-object-or-class-here) Examples from clojuredocs.org: [clojuredocs or cdoc] (user/clojuredocs name-here) (user/clojuredocs "ns-here" "name-here") hello-lein.core=> (use '[hello-lein.core]) nil hello-lein.core=> (commons-join "Hello" "World") "Hello, World" hello-lein.core=> (s2-is-empty? "Hello") false hello-lein.core=> (s2-is-empty? "") true
依存関係が解決できた状態で使用できていますね。REPLで、作った関数をお手軽に試せるというところが素晴らしい。
これで、Clojureでも依存関係の定義ができるようになりましたー。長らく目を背けていた、Clojure Contribも使えるようになるはず…。