2013-05-19 41 views
7

Tôi đã viết một ứng dụng nhỏ. Tôi đã đặt thông tin cơ sở dữ liệu cụ thể trong một tệp thuộc tính.Bao gồm một tập tin tài sản với một tập tin Jar

db.url=jdbc:mysql://localhost:3306/librarydb 
db.user=root 
db.passwd=pas$w0rd 

Khi tôi tạo ứng dụng để lấy tệp jar thực thi, tệp thuộc tính sẽ được đưa vào bên trong. Toàn bộ mục đích của việc đưa những thông tin đó vào một tệp thuộc tính là cho phép người dùng thay đổi chúng nhưng điều này làm cho nó không thể.

Làm cách nào để bao gồm tệp thuộc tính có tệp jar không có trong đó? Cũng giống như bạn làm với tập tin AppSettings trong các ứng dụng .NET.

Tôi rất mới đối với Java nên tôi đánh giá cao nếu bạn có thể chia nhỏ thành một tập hợp các bước.

Cảm ơn bạn.

EDIT:

Đây là cách tôi nhận được các giá trị từ tập các thuộc tính trong chương trình của tôi.

public class DatabaseHandler { 

    public static Connection connectToDb() { 
     Connection con = null; 
     Properties props = new Properties(); 
     InputStream in = null; 

     try { 
      in = DatabaseHandler.class.getResourceAsStream("database.properties"); 
      props.load(in); 
      in.close(); 

      String url = props.getProperty("db.url"); 
      String user = props.getProperty("db.user"); 
      String password = props.getProperty("db.passwd"); 

      con = DriverManager.getConnection(url, user, password); 
     } catch (Exception ex) {   
      Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } 
      return con; 
    } 

} 
+0

Nó không rõ ràng với tôi những gì bạn có ý nghĩa bởi "Làm thế nào tôi có thể bao gồm một thuộc tính tập tin với file jar không ở trong đó" - chỉ cần không đặt tệp thuộc tính vào tệp jar ... –

+0

Um ... ví dụ gần nhất tôi có thể đưa ra là tệp 'App.config' trong .NET. Khi tệp thực thi được tạo, tệp được đóng gói với nó, phải không? Không _inside_ nó. – Isuru

+0

Chắc chắn. Vì vậy, bây giờ bạn đã cung cấp mã, chúng ta có thể thấy những gì bạn cần làm - chỉ cần sử dụng 'FileInputStream' thay vì' getResourceAsStream'. –

Trả lời

0

Không mã hóa cứng vị trí của tệp thuộc tính. Cách tiếp cận của bạn nên là truyền tệp từ classpath.

Nếu không, cách tốt hơn là trỏ đến URL trả về thông tin thuộc tính ở định dạng dữ liệu cụ thể (nói JSON).

Nếu bạn có JAR hãy kiểm tra this.

Nếu đơn đăng ký của bạn là WAR, hãy kiểm tra properties in WAR.

2

Bạn có thể tải tệp thuộc tính từ đường dẫn lớp thay thế. Điều này cho phép bạn nhóm các tập tin bất động sản bên trong bình, nhưng cũng bên ngoài bình. Nó chỉ cần được trên classpath của ứng dụng đang chạy.

Bạn có thể làm như vậy theo cách sau:

Properties props = new Properties(); 
InputStream inputStream = this.getClass().getClassLoader() 
     .getResourceAsStream(propFileName); 

props.load(inputStream); 
+0

Vì vậy, nếu tôi chỉ đặt tệp thuộc tính vào cùng thư mục nơi tệp jar thực thi là, nó có hoạt động không? (Tôi cũng đã chỉnh sửa câu hỏi để đặt mã tôi đang sử dụng để truy xuất các giá trị từ tệp thuộc tính) – Isuru

6

Bạn đang đúng. Nếu thuộc tính này được dự định được sửa đổi bởi người sử dụng, sau đó đặt chúng trong một thuộc tính tập tin trong JAR sẽ không làm việc

Có một vài phương pháp:

  • Bạn có thể đặt các thuộc tính trong tệp thuộc tính mà bạn lưu trữ trong hệ thống tệp. Vấn đề là tìm hiểu nơi trong hệ thống tập tin để lưu trữ chúng:

    • Trên UNIX/Linux có ước cho nơi lưu trữ toàn hệ thống và mỗi người dùng thuộc tính cấu hình, nhưng đây là những một chút lỏng lẻo, và trong một chút trạng thái thông lượng (ví dụ: một số khung công tác "máy tính để bàn" nhất định có cơ chế ưu tiên riêng của chúng.

    • Có những quy ước tương tự cho Windows mà tôi tin.

    • Sự cố với phương pháp tiếp cận có thể là vấn đề quyền (bạn không muốn một người dùng thay đổi tùy chọn của người khác) và thậm chí có thể gặp sự cố với hệ thống tệp chỉ đọc và các loại tương tự.

    • Nếu bạn định sử dụng tệp thuộc tính trong hệ thống tệp, bạn nên cố định vị trí vào mã của mình. Làm cho nó có thể cấu hình thông qua một đối số dòng lệnh và/hoặc một "thuộc tính hệ thống" có thể được thiết lập bằng cách sử dụng tùy chọn -D.

  • Trên Windows, bạn có thể đặt các thuộc tính vào sổ đăng ký Windows. Nhưng bạn sẽ cần phải sử dụng thư viện của bên thứ 3 để thực hiện việc này. Và tất nhiên, đây không phải là di động - nó sẽ không hoạt động trên nền tảng không phải Windows.

  • Bạn có thể sử dụng Java Preferences API. Điều này là di động trên nhiều nền tảng nhưng nó là một giải pháp trung tâm Java; tức là nó không phù hợp với cách "bình thường" của nền tảng để làm mọi thứ.

Tóm lại, không có giải pháp nào lý tưởng từ mọi quan điểm.


Nhưng một khi bạn đã quyết định làm thế nào để lưu trữ sở thích của bạn, bạn có thể viết ứng dụng của bạn để nó sử dụng tập tin thuộc tính trong tập tin JAR của bạn để cung cấp mặc định hoặc cài đặt ban đầu.

2

thay vì

in = DatabaseHandler.class.getResourceAsStream("database.properties"); 

thử

in = DatabaseHandler.class.getResourceAsStream("/database.properties"); 
Các vấn đề liên quan