2011-08-25 11 views
6

Standart Maven dizin yapısını kullanarak kurulum yapan bir proje ile çalışıyorum, bu yüzden "kaynaklar" adlı bir klasörüm var ve bunun içinde "fontlar" adında bir klasör oluşturduktan sonra bir dosya koydum. Aşağıdaki gibi, bir 3. parti kitaplığından kullandığım bir nesneye tam String dosya yolunu (proje yapım içinde resources/fonts/somefont.ttf numaralı bir dosyada bulunan bir dosyanın) geçirmem gerekiyor. ama bunu yapmak için uygun şekilde biraz karıştı. Aşağıda denedim ama onu bulamıyor. Ben ResourceBundle kullanarak baktım ama bu sadece aşağıdaki gibi bir yönteme geçmek için bir yol geçmesi gerektiğinde gerçek bir File nesnesi yapmak içeren gibi görünüyordu (benim önümde gerçek yöntem çağrısı yok, sadece benim bellek):Java (maven web uygulaması), kaynak klasöründeki dosya için tam dosya yolunu mu alıyorsunuz?

Ben bir yol sınıf/paketinden tam göreli yolu kullanmak zorunda kalmadan kaynak klasörden dosya almak için standart Maven dizin yapısına sahip bir proje ile, orada düşünmüştü
FontFactory.somemethod("resources/fonts/somefont.ttf"); 

. Bu konuda herhangi bir tavsiye büyük beğeni topluyor.

Projede çalışan farklı geliştiriciler farklı kurulumlara sahip olduğundan ve bunu projenin bir parçası olarak yansıtmak istediklerinden, kaynak kodlarını doğrudan proje kaynaklarına gönderdiklerinde doğrudan kodlanmış bir yol kullanmak istemiyorum. .

Bu bir web uygulaması (Struts 1.3 uygulaması) ve içindir I (Tomcat aracılığıyla kapalı projeyi çalıştırıyorum olan) patlayan WAR dosyası içine baktığınızda, dosya yer almaktadır:

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

sonra ResourceBundle Dosya nesnesini alma File.getAbsolutePath kullanarak nesi var() (FontFactory.somemethod geçmek)? (WAR, dağıtımda genişletilmemişse bir File nesnesi almayı garanti etmediğinizi unutmayın.) – BobG

+0

Muhtemelen bununla ilgili bir sorun yok :) Teşekkürler, ben 'ResourceBundle 'ile bu kadar işe yaramadı, bu işe yarayacağını anlamış değilim, Teşekkürler – Rick

+0

için Size kullandığım bazı sözde kod yazmama izin verin altında başarı ile - ResourceBundle, ama Kaynak (bahar dışında) çalışır emin değilim: – BobG

cevap

11

Kanunu : senin durumunda

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" gibi bir şey olurdu.

+0

Aslında bu özel proje için bahar kullanmıyorum, muhtemelen bırakmış olmalı Bu anahtar kelime dışarı, bazen ben de ilkbaharda bunu yapmak için bir ihtiyacım var, bu yüzden her iki struts/bahar – Rick

+0

Küçük düzeltme çalışması için bir yol arıyordu: ClassPathResource rsrc = new ClassPathResource (classpathRelativePath); Bu şekilde .getFile() –

+0

@GoranNastov yöntemini çağırabilirsiniz. Geçerli dokümanlar bir "Resource # getFile()" çağrısı gösterir; detaylandırır mısın? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- –

0

Ne çalışması gerekir BobG tarafından verilen Loading XML Files during Maven Test run

cevabı vardı benzer hatlarda sorunun cevabını bakabilirsiniz. Kaynak dosya için bu yolun geçerli sınıfın yoluna göre akılda tutulması gerekir. Hem kaynak hem de java kaynak dosyaları,

1

sınıf yolundadır. Kaynak dizininiz savaşınızın kökündeyse, bu, kaynakların/fontların/somefont.ttf'nin, dosyanın bulunduğu bir "sanal yol" olacağı anlamına gelir. get the "real path" - mutlak dosya sistemi yolunu - ServletContext'ten yapabilirsiniz. Not (dokümanlardaki), bunun yalnızca SAVAŞ patladığında işe yarayacağını unutmayın. Kapsayıcı, uygulamayı genişletmeden savaş dosyasından çalıştırırsa, bu yöntem işe yaramaz.

+0

patlatılmış olarak çalıştırıyoruz ve yakında bunu değiştirdiğimizi görmüyorum, bu yüzden bu işe yarayacak. Teşekkürler – Rick

3

Dosyanın yolunu almak için aşağıda belirtilen kullanabilirsiniz:

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

kullanım/senin yöntemlere yolu geçmektedir.

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

Yol, URL'lerde temsil edilemiyorsa ve URL kodlu olarak işlenmiyorsa işe yaramaz. –

İlgili konular