5

У меня есть файл свойств, который, как это -Как переопределить значение файла свойств через аргументы командной строки?

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

А теперь я читаю вышеуказанный файл свойств из моей программы Java, как -

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(); 
    } 
} 

Большую часть времени, я буду работать моя выше программа, с помощью командной строки, как работоспособная банка, как это -

java -jar abc.jar config.properties 

Моих вопросов -

  • Можно ли переопределить вышеуказанные атрибуты в файле свойств через командную строку, не касаясь файла, если это необходимо? Поскольку я не хочу изменять файл config.properties всегда, когда мне нужно изменить значение атрибутов? Возможно ли это сделать?

Что-то вроде этого должно переопределить значение hostName в файле?

java -jar abc.jar config.properties hostName=machineB.domain.host.com 
  • А также, есть ли способ, чтобы добавить --help во время работы , что может рассказать нам больше о том, как запустить файл банку и что делает каждое средство собственности и как их использовать? Я видел --help во время работы большей части исполняемого файла C++ или Unix, поэтому не уверен, как мы можем сделать то же самое в Java?

Нужно ли использовать синтаксический анализатор CommandLine для этого в Java для достижения обеих вещей?

+3

Это когда вы используете из 'String [] args' переменного передается' статического ничтожного метода открытой main'. –

+0

@LuiggiMendoza Спасибо за предложение. Можете ли вы привести пример, как бы я это сделал? Мне также нужно добавить функциональность '--help', с помощью которой любой может узнать, как запустить эту банку и какие параметры конфигурации и что они означают в целом? Нужно ли нам использовать любой синтаксический анализатор командной строки, например JCommander? – john

+0

Вы можете сделать это вручную или использовать такую ​​библиотеку. Решение зависит от вас (или вашей команды). –

ответ

2

Если единственное, что вы будете иметь на вашем командной строки такие вещи, как: hostName=machineB.domain.host.com, а не каких-либо других типов аргументов, то вы можете упростить обработку вашей командной строки довольно много:

Во-первых, присоединиться все командную строку арг с новой строкой, как если бы они были новый конфигурационный файл:

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

сейчас, у вас есть два источника собственности, ваш файл, и эта строка. Вы можете загрузить их оба, чтобы один экземпляр свойств, с одной версии перезаписи другой:

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

Большое спасибо за помощь. Как насчет моего второго вопроса? Как бы я подошел к этому. Есть идеи? – john

+0

Для этого обычно используется CommandLine. Я (несколько лет назад) написал себе, что компания, над которой я работаю, принадлежит, поэтому я не могу поделиться. См. CLI Apache здесь: http://commons.apache.org/proper/commons-cli/ – rolfl

Смежные вопросы