2009-04-27 19 views
7

私はJ2EEアプリケーションをEARファイルとしてデプロイしています。これには、ビジネスレイヤーコード(いくつかのEJBを含む)用のJARファイルと、Webレイヤーコード用のWARファイルが含まれています。 EARファイルはJBoss 3.2.5にデプロイされ、EARファイルとWARファイルは展開されますが、JARファイルは展開されません(これは問題ではなく、FYIです)。EAR内のJAR内のファイルの絶対パスを取得していますか?

JARファイル内のファイルの1つは、絶対パスをネイティブMSワードコード(Jacob、FWIWを使用)に渡す必要があるMS Wordテンプレートです。

URL url = getClass().getResource("myTemplate.dot"); 
File file = new File(url.toURI()); // <= fails! 
String absolutePath = file.getAbsolutePath(); 
// Pass the absolutePath to MS Word to be opened as a document 

を...そしてjava.io.Fileコンストラクタが例外:IllegalArgumentException「URIが階層されていないスロー:

問題は、私は(JARファイル内のいくつかのコード内から)このようなファイルを取得しようとするということです" URLとURIの両方、すなわち同じのtoString()出力、持っている:

jar:file:/G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents/myapp.jar!/my/package/myTemplate.dot 

をパスのこの多くは、ファイルシステム上で有効ですが、残りの部分ではありません(JARファイルの内部である):

G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents 

このファイルの絶対パスを取得する最も簡単な方法は何ですか?

答えて

7

私の現在のソリューションは、コピーの絶対パスを使用し、その後、サーバーの一時ディレクトリにファイルをコピーすることです。

File tempDir = new File(System.getProperty("java.io.tmpdir")); 
File temporaryFile = new File(tempDir, "templateCopy.dot"); 
InputStream templateStream = getClass().getResourceAsStream("myTemplate.dot"); 
IOUtils.copy(templateStream, new FileOutputStream(temporaryFile)); 
String absolutePath = temporaryFile.getAbsolutePath(); 

私は、ファイルをコピー関与しないソリューションを好むだろう。

+0

この問題を発見したとき、私の最初のアイデアは「ええ、唯一の方法は一時ファイルを書くことです!そして驚き、それは唯一の方法です!どのようにして、瓶の中のパスを処理する方法がないのだろうか?あなたがストリームを得ることができれば、完璧な世界でFileを得ることができます。 –

1

URI文字列を渡すコードまたはアプリケーションが、jar/zipファイル内の場所を指定する形式を受け入れない限り、ファイルを一時的な場所にコピーするソリューションがおそらく最適です。

これらのファイルが頻繁に参照される場合は、抽出ファイルの場所をキャッシュし、必要になるたびにその存在を確認することができます。

+0

Chrisに感謝します。私はWordが絶対パスを必要とし、JAR/ZIP形式のパスで混乱することは間違いないと確信しています。私は実際に怠惰な - 元のファイルを一時フォルダにコピーしている、私はちょうど簡潔さのために私の答えのそれを残しました。 –

0

アプリケーションコンテナの内部ファイルを取得しようとすると、避けたい依存関係があるため、内容を一時ファイル(キャッシュ付きでも可)にコピーする必要があります。抽出されたファイルはまったくありません(JARから直接ロードできます)。

関連する問題