5

Tôi có một tập tin bất động sản đó là như thế này -Cách ghi đè giá trị tệp thuộc tính thông qua đối số dòng lệnh?

hostName=machineA.domain.host.com 
[email protected] 
[email protected] 
[email protected] 

Và bây giờ tôi đang đọc các tập tin bất động sản trên từ chương trình Java của tôi như -

public class FileReaderTask { 
    private static String hostName; 
    private static String emailFrom; 
    private static String emailTo; 
    private static String emailCc; 

    private static final String configFileName = "config.properties"; 
    private static final Properties prop = new Properties(); 

    public static void main(String[] args) { 
     readConfig(arguments); 
    } 

    private static void readConfig(String[] args) throws FileNotFoundException, IOException { 
     if (!TestUtils.isEmpty(args) && args.length != 0) { 
      prop.load(new FileInputStream(args[0])); 
     } else { 
      prop.load(FileReaderTask.class.getClassLoader().getResourceAsStream(configFileName)); 
     } 

     hostName = prop.getProperty("hostName").trim();   
     emailFrom = prop.getProperty("emailFrom").trim(); 
     emailTo = prop.getProperty("emailTo").trim(); 
     emailCc = prop.getProperty("emailCc").trim(); 
    } 
} 

Hầu hết thời gian, tôi sẽ được chạy chương trình trên của mình thông qua dòng lệnh như một jar Runnable như thế này -

java -jar abc.jar config.properties 

câu hỏi của tôi là -

  • Có cách nào chúng tôi có thể ghi đè các thuộc tính trên trong tệp thuộc tính thông qua dòng lệnh mà không cần chạm vào tệp nếu cần? Vì tôi không muốn sửa đổi tập tin config.properties của tôi luôn luôn bất cứ khi nào tôi cần phải thay đổi bất kỳ giá trị thuộc tính? Đây có phải là có thể làm gì?

Điều gì đó như thế này sẽ ghi đè giá trị hostName trong tệp?

java -jar abc.jar config.properties hostName=machineB.domain.host.com 
  • Và cũng có thể, là có cách nào để thêm --help khi chạy có thể cho chúng tôi biết thêm về làm thế nào để chạy các tập tin jar và những gì hiện mỗi phương tiện tài sản và làm thế nào để sử dụng chúng? Tôi đã thấy --help trong khi chạy hầu hết các công cụ thực thi C++ hoặc Unix để không chắc chắn làm thế nào chúng ta có thể làm điều tương tự trong Java?

Tôi có cần sử dụng trình phân tích cú pháp CommandLine cho điều này trong Java để đạt được cả hai thứ?

+3

Đó là khi bạn sử dụng biến 'String [] args' được chuyển sang phương thức' public static void main'. –

+0

@LuiggiMendoza Cảm ơn bạn đã đề xuất. Bạn có thể cung cấp một ví dụ làm thế nào tôi sẽ làm điều này? Tôi cũng cần thêm chức năng '--help' mà bất cứ ai cũng có thể biết cách chạy jar này và các tham số cấu hình khác nhau là gì và chúng có ý nghĩa gì? Chúng ta có cần sử dụng bất kỳ trình phân tích cú pháp dòng lệnh nào như JCommander không? – john

+0

Bạn có thể thực hiện thủ công hoặc sử dụng thư viện như vậy. Quyết định này tùy thuộc vào bạn (hoặc nhóm của bạn). –

Trả lời

2

Nếu điều duy nhất bạn sẽ phải vào dòng lệnh của bạn là những thứ như: hostName=machineB.domain.host.com và không bất kỳ loại khác của các đối số, sau đó bạn có thể đơn giản hóa việc xử lý dòng lệnh của bạn khá nhiều:

Thứ nhất, tham gia tất cả các dòng lệnh args với newlines như thể chúng là một tệp cấu hình mới:

StringBuilder sb = new StringBuilder(); 
for (String arg : args) { 
    sb.append(arg).append("\n"); 
} 
String commandlineProperties = sb.toString(); 

bây giờ, bạn có hai nguồn thuộc tính, tệp của bạn và chuỗi này. Bạn có thể tải chúng cả hai vào một cá thể Thuộc tính duy nhất, với một phiên bản ghi đè lên trường hợp khác:

if (...the config file exists...) { 
    try (FileReader fromFile = new FileReader("config.properties")) { 
     prop.load(fromFile); 
    } 
} 

if (!commandlineProperties.isEmpty()) { 
    // read, and overwrite, properties from the commandline... 
    prop.load(new StringReader(commandlineProperties)); 
} 
+0

Cảm ơn rolfl rất nhiều cho sự giúp đỡ. Còn câu hỏi thứ hai của tôi thì sao? Làm thế nào tôi sẽ tiếp cận cái đó. Bất kỳ ý tưởng? – john

+0

CommandLine thường được sử dụng cho điều đó. Tôi có (năm trước) đã tự viết rằng công ty tôi làm việc để sở hữu, vì vậy tôi không thể chia sẻ. Xem Apache CLI tại đây: http://commons.apache.org/proper/commons-cli/ – rolfl

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