2011-08-25 6 views
6

標準のMavenディレクトリ構造を使用してセットアップされているプロジェクトで作業しているので、 "resources"というフォルダがあり、この中に "fonts"というフォルダを作成してファイルを入れました。私が使用しているオブジェクトに完全なStringファイルパス(私のプロジェクト構造内にあるファイルの、resources/fonts/somefont.ttf)を以下のようにサードパーティのライブラリから渡す必要があります。これをしばらく検索しましたこれを行う適切な方法について少し混乱してきました。私は以下のように試しましたが、それを見つけることができません。私はResourceBundleを使用して見ましたが、それは実際のFileオブジェクトを作成する必要があるように見えました。私はパスを以下のようなメソッドに渡す必要があります(私の目の前で実際のメソッド呼び出しをしないでください。メモリ):Java(maven web app)、resourcesフォルダ内のファイルの完全なファイルパスを取得していますか?

FontFactory.somemethod("resources/fonts/somefont.ttf"); 

私は方法は、クラス/パッケージから完全な相対パスを使用することなく、リソースフォルダからファイルを取得するための標準的なMavenのディレクトリ構造を持つプロジェクトで、あったと思っていました。これに関するアドバイスは大歓迎です。

プロジェクトで作業している開発者が異なるため、ハードコードされたパスを使用したくないため、これをプロジェクトの一部として組み込み、プロジェクトソースをチェックアウトしたときに直接取得するようにしたい。

これは、Webアプリケーション(Strutsの1.3アプリ)用であり、私は(私はTomcatを経由のオフプロジェクトを実行しています)展開WARファイルに見たときに、ファイルがである:

<Exploded war dir>/resources/fonts/somefont.ttf 
+1

ResourceBundleからFileオブジェクトを取得し、File.getAbsolutePath()を使用してFontFactory.somemodod()に渡すと何が問題になりますか? (展開時にWARが展開されない場合、Fileオブジェクトを取得することは保証されていないことに注意してください。) – BobG

+0

おそらく何も間違っています:)ありがとう、私は 'ResourceBundle'に精通していないので、これがうまくいくとは分かりませんでした。チップのおかげで。 – Rick

+0

実際に私が使った疑似コードを投稿しましょう成功すると以下のようになります - ResourceBundleではわかりませんが、Resource(Spring以外)が動作します: – BobG

答えて

11

コード:お使いの場合には

import java.io.File; 
import org.springframework.core.io.*; 

public String getFontFilePath(String classpathRelativePath) { 
    Resource rsrc = new ClassPathResource(classpathRelativePath); 
    return rsrc.getFile().getAbsolutePath(); 
} 

、classpathRelativePathは "/resources/fonts/somefont.ttf" ようなものになるだろう。

+0

私はこの特定のプロジェクトに実際に春を使用していません。そのキーワードが出て、私は時々春にそれを行う必要があるので、私はストラット/スプリングの両方で動作する方法を探していた – Rick

+0

コードに小さな修正:ClassPathResource rsrc = new ClassPathResource(classpathRelativePath);この方法でメソッドを呼び出すことができます.getFile() –

+0

@GoranNastov現在のドキュメントは 'Resource#getFile()'呼び出しを表示します。あなたは精緻化できますか? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- –

0

あなたは、私が動作するはずBobGで与え Loading XML Files during Maven Test run

答えを持っていた同様のライン上の質問に対する回答を検索することができます。リソースファイルのパスは、現在のクラスのパスからの相対パスであることに注意する必要があります。リソースとJavaソースファイルの両方がクラスパスにあります

1

resourcesディレクトリがwarのルートにある場合、resources/fonts/somefont.ttfはそのファイルが利用できる "仮想パス"になります。 ServletContextから、絶対ファイルシステムのパスであるget the "real path"を実行できます。 WARが爆発した場合にのみ動作することに注意してください(ドキュメント内)。コンテナが展開せずにwarファイルからアプリを実行する場合、このメソッドは機能しません。

+0

私たちはそれを爆発的に実行しています。すぐに変更することはありませんので、これがうまくいくはずです。チップのおかげでよろしいです。 – Rick

3

あなたは、ファイルのパスを取得するには下記を使用することができます。

String fileName = "/filename.extension"; //use forward slash to recognize your file 
String path = this.getClass().getResource(fileName).toString(); 

使用/あなたの方法へのパスを渡します。

1
URL resource = getServletContext().getResource("/WEB-INF/classes/fonts/somefont.ttf"); 
String relativePath = resource.getPath(); 
+0

パスをURLで表現できず、URLエンコードされていれば動作しません。 –

関連する問題