我在我的应用程序中使用clojure.java.classpath,我想知道我缺少哪些设置,因为clojure.java.classpath/classpath-directories
当我从 uberjar 运行它时输出为空。
这是一个最小的工作示例:
项目.clj:
(defproject cptest "0.1.0-SNAPSHOT"
:description "classpath test"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.7.0"]
[org.clojure/java.classpath "0.2.2"]]
:profiles {:uberjar {:aot :all}}
:omit-source true
:main cptest.core)
和 src/cptest/core.clj:
(ns cptest.core
(:require [clojure.java.classpath :as cp])
(:gen-class))
(defn -main [& args]
(println "Classpath directories" (cp/classpath-directories)))
跑步时lein run
,我得到
`Classpath directories (#object[java.io.File 0x14555e0a /home/phil/cptest/src] #object[java.io.File 0x4bb33f74 /home/phil/cptest/target/classes])`
如果创建一个 uberjar lein uberjar
,那么
`java -jar /home/phil/cptest/target/cptest-0.1.0-SNAPSHOT-standalone.jar`
输出为空。Classpath directories ()
.
的输出jar tf /home/phil/cptest/target/cptest-0.1.0-SNAPSHOT-standalone.jar | grep cptest
(完整的输出很长):
META-INF/maven/cptest/cptest/pom.xml
META-INF/leiningen/cptest/cptest/project.clj
META-INF/maven/cptest/
META-INF/maven/cptest/cptest/
META-INF/maven/cptest/cptest/pom.properties
cptest/
cptest/core$fn__72.class
cptest/core$_main.class
cptest/core.class
cptest/core__init.class
cptest/core$loading__5340__auto____21.class
cptest/core.clj
更新
检查clojure/java/classpath.clj
,似乎调用
(classpath (clojure.lang.RT/baseLoader))
lein run
vsuberjar
方法
的行为不同,classpath
定义为:
(defn classpath
"Returns a sequence of File objects of the elements on the classpath."
([classloader]
(distinct
(mapcat
loader-classpath
(take-while
identity
(iterate #(.getParent ^ClassLoader %) classloader)))))
([] (classpath (clojure.lang.RT/baseLoader))))