Clojure程序如何找到自己的MANIFEST.MF(假设它打包在一个JAR文件中)。
我试图从我的“-main”函数执行此操作,但我找不到要在以下代码中使用的类:
(.getValue
(..
(java.util.jar.Manifest.
(.openStream
(java.net.URL.
(str
"jar:"
(..
(class **WHAT-GOES-HERE**)
getProtectionDomain
getCodeSource
getLocation)
"!/META-INF/MANIFEST.MF"))))
getMainAttributes)
"Build-number"))
感谢。
答案 0 :(得分:3)
这似乎可靠地运作:
(defn set-version
"Set the version variable to the build number."
[]
(def version
(.getValue (.. (Manifest.
(.openStream
(URL.
(str "jar:"
(.getLocation
(.getCodeSource
(.getProtectionDomain org.example.myproject.thisfile)))
"!/META-INF/MANIFEST.MF"))))
getMainAttributes)
"Build-number")))
答案 1 :(得分:1)
我发现我的版本在眼睛上更容易一些:
(defn manifest-map
"Returns the mainAttributes of the manifest of the passed in class as a map."
[clazz]
(->> (str "jar:"
(-> clazz
.getProtectionDomain
.getCodeSource
.getLocation)
"!/META-INF/MANIFEST.MF")
clojure.java.io/input-stream
java.util.jar.Manifest.
.getMainAttributes
(map (fn [[k v]] [(str k) v]))
(into {})))
(get (manifest-map MyClass) "Build-Number")
答案 2 :(得分:1)
这是一个可读的版本,就像我能得到它一样简单!
(when-let [loc (-> (.getProtectionDomain clazz) .getCodeSource .getLocation)]
(-> (str "jar:" loc "!/META-INF/MANIFEST.MF")
URL. .openStream Manifest. .getMainAttributes
(.getValue "Build-Number")))
答案 3 :(得分:0)
我找到了一个有效的答案,但是我愿意接受改进建议,特别是取代对Class/forName
的号召。
(defn -main [& args]
(println "Version "
(.getValue
(..
(Manifest.
(.openStream
(URL.
(str
"jar:"
(..
(Class/forName "org.example.myproject.thisfile")
getProtectionDomain
getCodeSource
getLocation)
"!/META-INF/MANIFEST.MF"))))
getMainAttributes)
"Build-number")))
答案 4 :(得分:0)
还有clj-manifest本质上提供此功能,使用与此处的其他答案类似的调用。