2011-08-25 34 views
6

Tôi đang làm việc với một dự án được thiết lập bằng cấu trúc thư mục Maven chuẩn nên tôi có một thư mục có tên là "resources" và trong đó tôi đã tạo một thư mục có tên là "fonts" và sau đó đặt một tệp vào đó. Tôi cần phải vượt qua đường dẫn tệp đầy đủ String (của tệp nằm trong cấu trúc dự án của tôi, tại resources/fonts/somefont.ttf) đến một đối tượng tôi đang sử dụng, từ thư viện của bên thứ 3, như bên dưới, tôi đã tìm kiếm trong một thời gian nhưng đã trở thành một chút bối rối như một cách thích hợp để làm điều này. Tôi đã thử như dưới đây nhưng nó không thể tìm thấy nó. Tôi nhìn vào sử dụng ResourceBundle nhưng điều đó dường như liên quan đến việc thực hiện một đối tượng thực tế File khi tôi chỉ cần đường dẫn để chuyển vào một phương thức như bên dưới (không có cuộc gọi phương thức thực tế trước mặt tôi) bộ nhớ):Java (ứng dụng web maven), nhận đường dẫn tệp đầy đủ cho tệp trong thư mục tài nguyên?

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

tôi đã nghĩ là có một cách, với một dự án với cấu trúc thư mục tiêu chuẩn Maven để có được một tập tin từ thư mục tài nguyên mà không cần phải sử dụng đường dẫn tương đối đầy đủ từ lớp/gói. Bất kỳ lời khuyên nào về điều này được đánh giá cao.

Tôi không muốn sử dụng đường dẫn mã hóa vì các nhà phát triển khác nhau làm việc trong dự án có các thiết lập khác nhau và tôi muốn đưa nó vào dự án để họ trực tiếp nhận được khi họ kiểm tra nguồn dự án .

này là dành cho một ứng dụng web (Struts 1.3 ứng dụng) và khi tôi nhìn vào các tập tin bùng nổ WAR (mà tôi đang chạy dự án tắt của qua Tomcat), các tập tin là tại địa chỉ:

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

Có gì sai khi nhận đối tượng Tệp từ ResourceBundle, sau đó sử dụng File.getAbsolutePath() để chuyển tới FontFactory.somemethod()? (Hãy nhớ rằng bạn không được bảo đảm để có được một đối tượng File nếu WAR không được mở rộng khi triển khai.) – BobG

+0

có lẽ không có gì là sai với điều đó :) cảm ơn, tôi không phải tất cả những gì quen thuộc với 'ResourceBundle' vì vậy đã không nhận ra điều này sẽ làm việc, cảm ơn cho các tip – Rick

+0

Trên thực tế hãy để tôi gửi cho bạn một số mã giả tôi đã sử dụng với thành công bên dưới - không chắc chắn về ResourceBundle, nhưng Tài nguyên (ngoài mùa xuân) hoạt động: – BobG

Trả lời

11

Mã :

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

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

Trong trường hợp của bạn, classpathRelativePath sẽ giống như "/resources/fonts/somefont.ttf".

+0

Tôi không thực sự sử dụng mùa xuân cho dự án cụ thể này mà từ khóa ra, tôi có một nhu cầu để làm điều đó trong mùa xuân đôi khi cũng có, vì vậy tôi đã tìm kiếm một cách mà sẽ làm việc trong cả hai struts/mùa xuân – Rick

+0

Chỉnh nhỏ để mã: ClassPathResource rsrc = new ClassPathResource (classpathRelativePath); Bằng cách này bạn có thể gọi phương thức .getFile() –

+0

@GoranNastov Các tài liệu hiện tại hiển thị một cuộc gọi 'Resource # getFile()'; bạn có thể xây dựng? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- –

0

Bạn có thể tìm kiếm các câu trả lời cho câu hỏi trên dây chuyền tương tự mà tôi đã Loading XML Files during Maven Test run

Câu trả lời được đưa ra bởi BobG nên làm việc. Mặc dù bạn cần lưu ý rằng đường dẫn cho tệp tài nguyên có liên quan đến đường dẫn của lớp hiện tại. Cả hai tài nguyên và tệp nguồn java đều có trong đường dẫn lớp

1

Nếu thư mục tài nguyên của bạn nằm trong thư mục gốc của chiến tranh, điều đó có nghĩa là tài nguyên/phông chữ/somefont.ttf sẽ là "đường dẫn ảo". Bạn có thể get the "real path" - đường dẫn hệ thống tệp tuyệt đối - từ ServletContext. Lưu ý (trong tài liệu) rằng điều này chỉ hoạt động nếu WAR bị phát nổ. Nếu vùng chứa của bạn chạy ứng dụng từ tệp chiến tranh mà không mở rộng nó, phương pháp này sẽ không hoạt động.

+0

chúng tôi chạy nó như phát nổ và tôi không thấy rằng thay đổi bất cứ lúc nào sớm vì vậy điều này sẽ làm việc, nhờ đầu – Rick

3

Bạn có thể sử dụng đề cập dưới đây để có được đường dẫn của file:

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

sử dụng/vượt qua đường dẫn đến các phương pháp của bạn.

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

Không hoạt động nếu đường dẫn không thể được đại diện trong URL và được mã hóa URL. –

Các vấn đề liên quan