2008-08-25 38 views
72

Tôi đang trong quá trình xóa bỏ tất cả các giá trị được mã hóa trong thư viện Java và tự hỏi khung nào sẽ là tốt nhất (về cấu hình zero hoặc close-to-zero) để xử lý thời gian chạy cấu hình? Tôi thích các tệp cấu hình dựa trên XML, nhưng nó không cần thiết.Khuôn khổ cấu hình Java

Vui lòng chỉ trả lời nếu bạn có trải nghiệm thực tế với khung. Tôi không tìm kiếm ví dụ, nhưng trải nghiệm ...

+0

Trong quá khứ, tôi cũng đã vật lộn với điều này và cuối cùng dựa vào java.utils.Properties, cấu hình Apache Commons, Google Guava và Maven để tạo giải pháp cấu hình gần bằng 0 mà chúng tôi thực sự định cấu hình cho hệ thống cũ nhưng chỉ cần sử dụng ra khỏi hộp cho mới. Lần lặp mới nhất trên Maven Central: https://github.com/sofdes/config-generation-maven-plugin – user1016765

Trả lời

29

Nếu giá trị mã hóa của bạn chỉ là cặp khóa-giá trị đơn giản, bạn nên xem java.util.Properties. Nó đơn giản hơn rất nhiều so với xml, dễ sử dụng hơn và không cần phải thực hiện.

Nếu bạn đang làm việc với Java và dữ liệu bạn lưu trữ hoặc truy xuất từ ​​đĩa được mô phỏng như một cặp giá trị khóa (có vẻ như nó nằm trong trường hợp của bạn), thì tôi thực sự không thể tưởng tượng được giải pháp tốt hơn.

Tôi đã sử dụng các tệp thuộc tính để cấu hình đơn giản các gói nhỏ trong một dự án lớn hơn và cấu hình toàn cầu hơn cho toàn bộ dự án và tôi chưa bao giờ gặp vấn đề với nó.

Tất nhiên điều này có lợi ích to lớn là không yêu cầu bất kỳ thư viện của bên thứ ba nào để sử dụng.

+2

Trong khi các thuộc tính là phần đơn giản nhất, như bạn đã nói, quá trình tải ít hơn. Kiểm tra http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html –

+4

+1 Đối với các thuộc tính nếu bạn chỉ cần cặp khóa/giá trị. Khi bạn bắt đầu cần danh sách hoặc bản đồ, đã đến lúc chuyển sang một giải pháp khác. – NateS

+0

Tôi thích câu trả lời của @ John - ngay cả khi bạn sử dụng các thuộc tính, điều quan trọng là phải có một số khung công tác để sau này bạn có thể chuyển đổi triển khai cơ bản mà không cần viết lại tất cả mã của mình. http://stackoverflow.com/questions/25765/java-configuration-framework/34397#34397 – ripper234

3

tôi có xu hướng sử dụng java.util.Properties (hoặc các lớp học tương tự như trong các ngôn ngữ khác và khung) wrapped in an application-specific configuration class hầu hết thời gian, nhưng tôi rất quan tâm đến việc lựa chọn thay thế hoặc các biến thể về vấn đề này. Đặc biệt là kể từ khi mọi thứ có thể trở thành một chút khó khăn nếu hộp thoại cấu hình đồ họa hoặc nhiều quan điểm về dữ liệu cấu hình có liên quan.

Thật không may là tôi không có kinh nghiệm với các thư viện cụ thể cho Java (ngoại trừ những thư viện mà tôi đã viết), nhưng mọi con trỏ sẽ được đánh giá cao.

Cập nhật

OK. Điều đó không hoàn toàn đúng, ba là Spring Java Configuration Project.

2

I wrote về điều này một vài tuần trước và đi đến kết luận rằng XML là một trong những ký hiệu được sử dụng rộng rãi nhất.

Có phải là ứng dụng tốt nhất không? Tôi không nghĩ như vậy, tôi thực sự thích JSON, nhưng công cụ vẫn không lên đến XML vì vậy tôi đoán chúng ta phải chờ xem.

6

Commons Configuration

Chúng tôi đang sử dụng tính năng này. Chỉ các tệp thuộc tính dễ xử lý hơn nhiều, nhưng nếu bạn cần đại diện cho cấu hình dữ liệu phức tạp hơn, có thể làm điều này và đọc các tệp thuộc tính của bạn.

Nếu bạn không làm bất cứ điều gì phức tạp, tôi sẽ dính vào tệp thích hợp.

42

Apache Commons Configuration hoạt động tuyệt vời. Nó hỗ trợ có cấu hình được lưu trữ trong một loạt các định dạng trên backend bao gồm các thuộc tính, XML, JNDI, và nhiều hơn nữa. Nó rất dễ sử dụng và mở rộng. Để có được sự linh hoạt nhất trong số đó, hãy sử dụng factory để nhận cấu hình và chỉ sử dụng Configuration interface sau đó.

Hai tính năng của Commons Cấu hình mà phân biệt nó trên một tập tin thuộc tính thẳng là nó hỗ trợ chuyển đổi tự động để loại phổ biến (int, float, mảng String) và nó hỗ trợ thay thế tài sản:

server.host=myHost 
server.url=http://${server.host}/somePath 
+0

https://github.com/sofdes/config-generation-maven-plugin – user1016765

5

Nếu bạn muốn để làm điều gì đó tiên tiến (và an toàn hơn), bạn có thể muốn xem xét điều này: http://www.ibm.com/developerworks/java/library/j-configint/index.html

+0

Tôi bạn bằng cách 'nâng cao' có nghĩa là 'làm điều đó chính bạn 'sau đó: có. Nhưng tôi đã nhắm vào các khung công tác hiện có hơn, chứ không phải DIY. Nhưng dù sao thì tốt đẹp. – Steen

0

Thuộc tính rất đơn giản, nếu bạn cần thêm chức năng, bạn có thể định dạng một số tệp cấu hình của bạn dưới dạng lớp Java. Chúng có thể được đặt trong một gói/mô-đun khác và có thể được biên dịch trước hoặc được nạp vào thời gian chạy với một thư viện như BeanShell.

Lưu ý: Trong trường hợp đơn giản nhất (được biên dịch trước), bạn không cần thêm bất kỳ thư viện nào.

0

Về các đề xuất sử dụng java.util.Properties - bắt đầu từ jdk 1.5, API tùy chọn (java.util.prefs) dường như là lựa chọn ưu tiên để sử dụng API thuộc tính.

Lý do: tăng khả năng mở rộng, tính trung lập của back-end, vv.

+0

Tôi đã sử dụng Preferences trong một thời gian, nhưng đó là một nỗi đau trong Windows Vista Tôi đang tìm kiếm một cái gì đó khác bây giờ ... – dave4351

+0

API sở thích là khá thô. Ngoài ra, tôi đã thấy nó hoàn toàn thất bại trên Linux do một số vấn đề quyền.Bên cạnh đó, Preferences không thể thay thế Properties vì ​​nó di chuyển cấu hình đến vị trí trung tâm. Điều này tác động đến bạn nếu bạn muốn nhiều hơn một thể hiện của chương trình đang chạy trên cùng một máy tính. Ví dụ, Preferences không phải là một nơi tốt để lưu trữ cấu hình cho một WAR. – NateS

20

Dưới đây là tùy chọn khác nhau:

Bạn có thể muốn đọc Comparison of Commons Configuration With JFig and JConfigConfiguring your Applications using JFig để biết một số phản hồi từ những người dùng khác nhau.

Cá nhân, tôi đã sử dụng jConfig và đó là một trải nghiệm tốt.

1

Bạn có thể thử YamlBeans. Bằng cách này bạn viết bất cứ lớp nào bạn muốn giữ dữ liệu cấu hình của bạn, sau đó bạn có thể tự động viết và đọc chúng đến và từ YAML.

YAML là định dạng dữ liệu có thể đọc được của con người. Nó có sức mạnh biểu cảm hơn java.util.Properties. Bạn có thể có danh sách, bản đồ, neo, gõ dữ liệu, vv

1

Hãy xem tại URL này: http://issues.apache.org/jira/browse/CONFIGURATION-394

Khung cấu hình mà chúng tôi đang tìm kiếm nó là cái gì trên đầu trang của Commons Cấu hình Apache và phải hỗ trợ các vấn đề đồng thời, vấn đề JMX và hầu hết các cửa hàng (ví dụ: tệp .properties, .xml hoặc PreferencesAPI).

Nhóm weblogic cung cấp trên 'Bảng điều khiển quản trị' là intersting mà qua đó bạn có thể cập nhật giao dịch (nguyên tử) trên cấu hình để người nghe đăng ký được thông báo.

Những người Apache nhấn mạnh rằng dự án này nằm ngoài phạm vi cấu hình Commons, có thể!

Tôi đã đính kèm một khung cấu hình đơn giản, hãy xem xét vui lòng.

1

Tôi vừa đăng một đoạn ngắn gọn của code về việc sử dụng ClassPathResource của Spring làm phương án thay thế cho IoC. ClassPathResource cho phép bạn đặt các tệp thuộc tính ở bất kỳ đâu trên đường dẫn lớp (ví dụ, tất cả ở một nơi, hoặc như các đồng nghiệp với mã mà chúng cấu hình. Ví dụ của tôi chỉ sử dụng java.util.Properties, vì vậy bạn có thể sử dụng kiểu chữ "name = value" hoặc định dạng XML của nó.

0

bạn có thể có một cái nhìn tại mới công bố tools4j-config mà tuyên bố sứ mệnh là để cho phép bạn dễ dàng xử lý các cấu hình khi chạy.

5

các Parameter Sử dụng Intelligent Tool (đầu vào, page) cho phép externalize gần như bất kỳ (hard coded) quyết định như một tham số vào một tập tin cấu hình dựa trên XML Nó đã được bắt đầu vào đầu năm 2012 như là một respons e cho những thiếu sót được nhận thức trong các công cụ cấu hình hiện có đối với tính tổng quát và sự tách biệt các mối quan tâm.

đầu vào có lẽ là mạnh hơn hầu hết các trường hợp sử dụng đòi hỏi, vì nó cho phép các ngôn ngữ trình xây dựng độc lập của dữ liệu thực nghiệm (đầu vào - đầu ra), với các tính năng như định nghĩa của mô tả phức tạp để ánh xạ lớp, hoặc cấu hình ngẫu nhiên sinh sản và xác nhận dựa trên phạm vi giá trị được xác định trước (để kiểm tra và nghiên cứu, ví dụ như mô phỏng Monte Carlo). Bạn có thể xác định tham số có thông số phụ, các hạn chế tương đối về giá trị tham số (param số a> param b) v.v.

Vẫn còn trong phiên bản beta, nhưng khá ổn định, tôi sử dụng nó cho nghiên cứu của mình, cho cấu hình và tài liệu thử nghiệm và cho mục đích giảng dạy. Khi nó có sẵn cho các ngôn ngữ khác (bộ chuyển đổi C++ trong đường ống), các nhà nghiên cứu/học viên khác có thể tái sử dụng các mô tả chạy các triển khai của chúng cùng các thuật toán trong C++ (sử dụng khái niệm lập bản đồ mã). Bằng cách đó, kết quả thử nghiệm có thể được xác thực/chương trình có thể được di chuyển dễ dàng hơn. Tài liệu vẫn đang trong quá trình làm việc, nhưng một vài ví dụ có sẵn trên trang. INPUT là mã nguồn mở phần mềm.

Đối với những người quan tâm, số Conceptual Research Paper.