2010-05-01 18 views
5

Bir Clojure programı kendi MANIFEST.MF dosyasını nasıl bulabilir (bir JAR dosyasında paketlendiği varsayılarak). Clojure programı kendi MANIFEST.MF okunurken

benim "-Ana" işlevinden bu yapmaya çalışıyorum, ancak bir sınıf aşağıdaki kodda kullanmak bulamıyorum:

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

teşekkür ederiz.

+0

Teşekkürler, bu yardımcı oldu. Biraz refactoring yaptım çünkü bu konuda takıntılıyım. (defn olsun fonksiyonlu-location [sym] (.. (sınıf sym) getProtectionDomain getCodeSource GetLocation)) (defn [] get-tezahür-niteliklerini (: İşte ben ile sona ne [location (get-function-location get-manifest-attributes)] (ne zaman değil (nil? yeri) (-> (str "jar:" location "! /META-INF/MANIFEST.MF") (URL.) (.openStream) (Manifest.) (.getMainAttributes))))) –

+0

Düzeltme: simgenin işleve aktarılması değil doğru çalışıyor. Yer alma ve sınıfta get-location geçme için get-function-location yeniden adlandırma yaparak sona erdi. –

cevap

3

Bu güvenilir iş gibi görünüyor o!

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

Çalıştığım bir yanıt buldum, ancak özellikle Class/forName numaralı telefonu aramayı değiştirmeye yönelik önerilere açığım. Ben alabilir gibi Burada, yaklaşık olarak basit okunabilir bir versiyonu

(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

:

(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

: Ben gözleri biraz daha kolay benim versiyonunu bulmak

(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

da esasen burada bulunan diğer cevaplar benzer bir çağrı kullanarak, bu işlevselliği sağlayan clj-manifest yoktur.