2013-07-11 35 views
11

Tôi đang viết một ứng dụng java có chứa rất nhiều cài đặt có thể đặt được. Về cơ bản cấu hình cấu hình của tôi trông giống như sau:Cách tốt nhất để duy trì một tập tin cấu hình cho ứng dụng java

 
Config 
|_ game 1 
    |_ Game name: blah... 
    |_ Player name: alice 
    |_ Player name: bob 
    |_ other settings... 
|_ game 2 
    |_ Game name: hah 
    |_ Player name: alice 
    |_ Player name: bob 
    |_ other settings... 
|_ game n.... 

Bạn có ý tưởng. Tôi đã cố gắng sử dụng xml nhưng làm việc với dom4j là một nỗi đau đặc biệt là có rất nhiều nút con có cùng tên trong các nút cha mẹ khác nhau và giống nhau và tôi cần phải thay đổi chúng rất nhiều. Cho đến nay, cách đơn giản nhất mà tôi khám phá là sử dụng một tệp văn bản thuần túy như

 
[Game 1] 
Game name: blah 
Player name: alice 
Player name: bob 
... 

[Game 2] 
... 

Nhưng tôi cảm thấy điều này rất thô sơ. Vì vậy, thực hành tốt nhất hoặc tiêu chuẩn trong ngành công nghiệp để duy trì các tập tin cấu hình trong java là gì?

EDIT: Tôi muốn giải pháp di động, như sao chép tệp từ máy tính này sang máy tính khác sẽ không phá vỡ chương trình. (Xin lỗi quên đề cập đến điều này trước.)

Trả lời

2

Bạn nên sử dụng trình tự động sửa lỗi để ghi tệp XML của mình. Một vài năm trước, tôi đã sử dụng CastorXML nhưng ngày nay, có thể có nhiều API hiện đại hơn cho mục đích đó.

Với API này, về cơ bản bạn:

  • Lưu trữ tất cả các cấu hình của bạn trong một POJO đơn giản
  • Khởi tạo một marshaller
  • Gọi marshaller.write (MyConfig)

Khi bạn muốn để tải cấu hình của bạn:

  • Nhanh chóng một Unmarshaller
  • gọi Marshaller.read (yourFile)

Bạn có thể mô tả các bản đồ XML trong một file cấu hình hoặc sử dụng một marshaller (1 thuộc tính tag ~ 1 XML) mặc định

Nó là đơn giản .

EDIT:

Sau khi tìm kiếm trong this thread, JAXB đặc điểm kỹ thuật đưa ra sau khi realease đầu tiên của CastorXML và thực hiện Sun của JAXB vẻ như bây giờ trở thành một tiêu chuẩn cho Java <-> XML lập bản đồ.

+0

Trình ngắt giao dịch ở đây là tôi có nhiều thuộc tính có cùng tên, như 'tên người chơi'. Vì vậy, khi tôi muốn thay đổi 'Alice' thành' Leo', tôi muốn chắc chắn rằng nó không ghi đè lên 'Bob' ở đây. CastorXML có thể đảm bảo điều đó không? Cảm ơn. – YankeeWhiskey

1

Khám phá Apache Commons Configuration.

Nó cung cấp hỗ trợ tốt cho hierarchical configurations.

XMLConfiguration config = new XMLConfiguration("games.xml"); 
String gameName = config.getString("game1.name"); 
List<Object> playerNames = config.getList("game1.players.player.name"); 
// ... 
config.setProperty("game1.name", "Space Invaders"); // update game name 
config.addProperty("game1.players.player(-1).name", "ted"); // add new players 
config.addProperty("game1.players.player(-1).name", "carol"); 
config.clearTree("game1.players.player(1)"); // remove a player 

// Or with XPath 
config.setExpressionEngine(new XPathExpressionEngine()); 
config.addProperty("game1/players player/name", "ted"); 
config.addProperty("game1/players player/name", "carol"); 
config.clearTree("game1/players/player[2]"); 
1

Xem xét sử dụng YAML để xác định cấu hình của bạn, đó là ít hơn nhiều tiết so với XML, ví dụ:

games: 
    - name: 'game 1' 
    players: ['Bob', 'Alice'] 
    ... 
    - name: 'game 2' 
    players: ['Bob', 'Alice'] 
    ... 

Sau đó bạn có thể sử dụng thư viện Jackson với YAML extension để tương tác với các cấu hình, cho ví dụ để phân tích cú pháp cấu hình:

File configFile = new File("..."); 
ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 
Configuration config = mapper.readValue(configFile, Configuration.class);