2009-04-22 48 views
14

Tôi có tệp .jar tôi đang kết hợp với nhau. Tôi muốn tạo một tệp .properties thực sự đơn giản với những thứ có thể định cấu hình như tên của người dùng & những thứ khác, để họ có thể chỉnh sửa bằng tay thay vì phải có trình chỉnh sửa GUI.Truy cập các tệp thuộc tính bên ngoài .jar?

Những gì tôi muốn làm là để có thể tìm kiếm, theo thứ tự này:

  1. một thuộc tính tập tin nào đó (args[0])
  2. MyApp.properties trong thư mục hiện hành (thư mục mà từ đó Java được gọi là)
  3. MyApp.properties trong thư mục của người dùng (tài sản user.home hệ thống?)
  4. MyApp.properties trong thư mục chứa .jar ứng dụng được lưu trữ

Tôi biết cách truy cập # 1 và # 3 (tôi nghĩ), nhưng làm cách nào để xác định thời gian chạy # 2 và # 4?

Trả lời

6

# 2 là thuộc tính hệ thống "user.dir". # 3 là thuộc tính "user.home".

# 4 là một chút kludge bất kể bạn tiếp cận nó như thế nào. Đây là một kỹ thuật thay thế hoạt động nếu bạn có một lớp được nạp từ một JAR không phải trên đường dẫn lớp hệ thống.

CodeSource src = MyClass.class.getProtectionDomain().getCodeSource(); 
if (src != null) { 
    URL url = new URL(src.getLocation(), "MyApp.properties"); 
    ... 
} 
else { 
    /* Fail... */ 
} 
+0

hoạt động rất độc đáo. :-) cảm ơn! –

+0

@erickson nó hoạt động! nhưng nếu tôi có MyApp.properties bên trong một cái bình và trong thư mục bên ngoài (không phải bên trong bất kỳ gói nào). Sau đó làm thế nào để đọc nó? – Achyut

6

Đối với thư mục làm việc hiện tại:

new File("."); 

Đối với một file có tên MyApp.properties trong thư mục hiện:

new File(new File("."), "MyApp.properties"); 
+3

Điều đó có hiệu quả, nhưng thậm chí ngắn hơn là chuyển chuỗi trống (tệp mới ("")) – StaxMan

+0

Tôi đã học được điều gì đó! Cảm ơn :) –

10

Đối với 4, bạn có thể thử này. Lấy classpath:

String classpath = System.getProperty("java.class.path"); 

Sau đó tìm kiếm nó cho tên của jar ứng dụng của bạn:

int jarPos = classpath.indexOf("application.jar"); 

phân tích ra các con đường dẫn đến nó:

int jarPathPos = classpath.lastIndexOf(File.pathSeparatorChar, jarPos) + 1; 
String path = classpath.substring(jarPathPos, jarPos); 

Sau đó thêm MyApp.properties. Hãy chắc chắn kiểm tra jarPos == -1, có nghĩa là không tìm thấy jar nếu classpath (có lẽ khi chạy trong môi trường dev của bạn).

+0

Bạn đã tìm kiếm điều này trong 1 tuần, ở mọi nơi họ nói sử dụng 'Main.class.getProtectionDomain(). GetCodeSource()', KHÔNG LÀM VIỆC !!! ít nhất không phải trên Mac từ bên trong Nội dung của một tập tin .app ... Nhưng điều này cuối cùng đã giải quyết vấn đề của tôi ... Cảm ơn bạn rất nhiều ... –

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