57

Clojure プロジェクト (GUI アプリケーション) で Leiningen を使用しており、プロジェクト ルートの下に "resources" ディレクトリを作成して、アプリが使用するイメージを保持しています。

テスト中にアプリをローカルで実行しているときに、相対パス「resources/logo.png」を使用して画像をフェッチすると、これは正常に機能します。しかし、Leiningen を使用して uberjar をビルドすると、Leiningen はリソース フォルダーのファイルを JAR のルート フォルダーに配置するため、リソース ファイルへの参照が機能しなくなります。

Leiningen を使用してこのようなリソースにアクセスする正しい方法は何ですか?

4

8 に答える 8

52

前の回答者 (skuro) は、クラスパスからファイルを取得する必要があると指摘しました。もう少し掘り下げた後、これが私の場合に有効な解決策のようです:

(.getFile (clojure.java.io/resource "foo.png"))
于 2011-11-04T14:17:49.537 に答える
32

Kevin Albrecht の回答に対する単なる構文糖衣:

(require '[clojure.java.io :as io])

(-> "foo.png" io/resource io/file) 
于 2013-06-02T07:36:40.890 に答える
16

Leiningenは、フォルダーレイアウトがわずかに異なる、Mavenからのリソースの規則を借用しています。このルールでは、resourcesフォルダーをコンパイル時のクラスパスルートとして使用する必要があると規定されています。つまり、leiningenは、resourcesフォルダー内のすべてのファイルをjar内のルートの場所に配置するのに適切です。

問題は、物理的な場所!=クラスパスの場所であるため、アプリケーションをパッケージ化するときに前者は変更されますが、後者は同じままです(classpath:/

クラスパスの場所を利用してファイルシステムリソースを見つけるか、jarから取り出して、静的または構成可能なフォルダーのいずれかの予測可能なフォルダーに配置することをお勧めします。

于 2011-11-04T13:28:32.503 に答える
6

私はまったく同じ問題を抱えていましたが、解決策はまったく使用io/fileされていません。たとえば、これは私のアプリの作業コードです。

(defn load-md [md]
  (->
   md
   io/resource ;;clojure.java.io
   slurp
   mp
   to-hiccup
   html))
于 2015-03-19T22:44:42.717 に答える
3

それを行う良い方法。は Javaオブジェクトをio/file返すことに注意してください。これは、 などに渡すことができます。Fileslurp

(ns rescue.core
  (:require [clojure.java.io :as io] ))

(def data-file (io/file
                 (io/resource 
                   "hello.txt" )))
(defn -main []
  (println (slurp data-file)) )

次に、lein プロジェクト ディレクトリで次のコマンドを実行すると、次のようになります。

> echo "Hello Resources!" > resources/hello.txt
> lein run
Hello Resources!

そしてプレスト!クラスパス経由でリソース ファイルを読み込んでいます。

于 2014-05-01T22:35:46.917 に答える