Clojure程序读取自己的MANIFEST.MF

时间:2010-05-01 18:13:52

标签: clojure manifest

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

感谢。

5 个答案:

答案 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本质上提供此功能,使用与此处的其他答案类似的调用。