2010-05-01 8 views
5

एक क्लोजर प्रोग्राम को अपना स्वयं का MANIFEST.MF कैसे प्राप्त कर सकता है (मान लीजिए कि यह एक JAR फ़ाइल में पैक किया गया है)।क्लोजर प्रोग्राम अपने स्वयं के 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 मिल-प्रकट-जिम्मेदार बताते हैं [] (: यहाँ है कि मैं क्या साथ समाप्त हो गया है चलो [स्थान (कार्य-कार्य-स्थान प्राप्त-प्रकट-विशेषताएँ)] (जब-नहीं (शून्य? स्थान) (-> (str "jar:" location "! /META-INF/MANIFEST.MF") (यूआरएल।) (.openStream) (प्रकट करें) (.getMainAttributes)))) –

+0

सुधार: फ़ंक्शन पर प्रतीक पास करना नहीं था सही ढंग से काम कर रहा है। मैं स्थान प्राप्त करने और कक्षा में स्थान प्राप्त करने के लिए गेट-फ़ंक्शन-स्थान का नाम बदल रहा हूं। –

उत्तर

3

यह मज़बूती से काम करने लगता है

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

मुझे एक ऐसा उत्तर मिला है जो काम करता है, हालांकि मैं इसे सुधारने के लिए सुझावों के लिए खुला हूं, विशेष रूप से कॉल को Class/forName पर बदल रहा हूं।

(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

मैं अपने संस्करण आंखों पर थोड़ा आसान लगता है:

(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

यहाँ एक पठनीय संस्करण है, के बारे में के रूप में सरल रूप में मैं मिल सकता है यह!

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

वहाँ भी clj-manifest कि अनिवार्य रूप से, इस सुविधा प्रदान करता है एक कॉल यहां पाया अन्य उत्तर के लिए इसी तरह का उपयोग कर रहा है।