2010-05-01 51 views
5

Clojure程序如何找到自己的MANIFEST.MF(假設它打包在JAR文件中)。Clojure程序讀取自己的MANIFEST.MF

我想從我的「 - 主」的功能做到這一點,但我不能找到一個類下面的代碼中使用:

(.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

謝謝,這很有幫助。我做了一些重構,因爲我對此很迷戀。這是我結束了: (DEFN得到功能定位 [符號] (..(類符號) getProtectionDomain getCodeSource 的getLocation)) (DEFN得到艙單的屬性 [] (讓[location(get-function-location get-manifest-attributes)] (when-not(nil?location) ( - >(str「jar:」location「!/META-INF/MANIFEST.MF)) (URL。) (.openStream) (Manifest。) (.getMainAttributes))))) – 2012-05-25 22:49:40

+0

更正:將符號傳遞給函數不是正常工作。我最終做了重命名get-function-location來獲取位置並將get-location傳遞給類。 – 2012-05-25 23:45:12

回答

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"))) 
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"))) 
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") 
1

這裏有一個閱讀的版本,大概就這麼簡單,我能得到它!

(when-let [loc (-> (.getProtectionDomain clazz) .getCodeSource .getLocation)] 
    (-> (str "jar:" loc "!/META-INF/MANIFEST.MF") 
     URL. .openStream Manifest. .getMainAttributes 
     (.getValue "Build-Number"))) 
0

還有clj-manifest,基本上提供了這個功能,使用類似於這裏找到其他的答案的電話。

相關問題