首页 文章

Clojure:如何将资源包含在lein-uberjar中

提问于
浏览
2

我想在clojure-project中使用一个可更改的文件 . (Manjaro Linux和Leiningen 2.8.0在Java 1.8.0_144 OpenJDK 64位服务器VM上)

所以,我试过......($ echo resources / temp.txt =>你好)

(ns test.core
  (:require [clojure.java.io :refer [writer input-stream]]
            [clojure.java.io :as io])
  (:gen-class))

(str (io/resource ""))
(defn -main
  []
 (with-open [r (input-stream (io/resource "temp.txt"))]
    (loop [c (.read r)] 
      (if (not= c -1)
        (do 
          (print (char c)) 
          (recur (.read r))))))
  (with-open [r (writer (.getFile (io/resource "temp.txt")))]
    (.write r "See you!"))
  )

和project.clj在这里......

(defproject test "0.1.0-SNAPSHOT"
   :description "FIXME: write description"
   :url "http://example.com/FIXME"
   :license {:name "Eclipse Public License"
             :url "http://www.eclipse.org/legal/epl-v10.html"}
   :dependencies [[org.clojure/clojure "1.8.0"]]
   :main test.core)

这个程序可以在lein-run中运行

$ lein run
Hello
$

但这不能在lein-uberjar中运行 - > java -jar test-0.1.0-SNAPSHOT-standalone.jar

$ lein uberjar
$ java -jar test-0.1.0-SNAPSHOT-standalone.jar
Exception in thread "main" java.io.FileNotFoundException: /home/***/Documents/test/target/test-0.1.0-SNAPSHOT-standalone.jar!/temp.txt (
No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at clojure.java.io$fn__9522.invokeStatic(io.clj:230)
at clojure.java.io$fn__9522.invoke(io.clj:230)
at clojure.java.io$fn__9459$G__9428__9466.invoke(io.clj:69)
at clojure.java.io$fn__9526.invokeStatic(io.clj:242)
at clojure.java.io$fn__9526.invoke(io.clj:240)
at clojure.java.io$fn__9459$G__9428__9466.invoke(io.clj:69)
at clojure.java.io$fn__9534.invokeStatic(io.clj:261)
at clojure.java.io$fn__9534.invoke(io.clj:259)
at clojure.java.io$fn__9459$G__9428__9466.invoke(io.clj:69)
at clojure.java.io$fn__9496.invokeStatic(io.clj:166)
at clojure.java.io$fn__9496.invoke(io.clj:166)
at clojure.java.io$fn__9472$G__9424__9479.invoke(io.clj:69)
at clojure.java.io$writer.invokeStatic(io.clj:119)
at clojure.java.io$writer.doInvoke(io.clj:104)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at test.core$_main.invokeStatic(core.clj:15)
at test.core$_main.invoke(core.clj:7)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.AFn.applyTo(AFn.java:144)
at test.core.main(Unknown Source)

我如何获得正确的路径?谢谢 .

1 回答

  • 1

    一个问题是 .getFile 没有从zip文件读取,而不是文件系统上的目录结构 . 而且,'s not recommended to change files inside a jar file (I'我不确定它是否可能) . 另见Reading a resource file from within jar .

相关问题