5

mam pliku właściwość, która jest tak -Jak przesłonić wartość pliku właściwości za pomocą argumentów wiersza poleceń?

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

A teraz czytam powyższy plik właściwości z mojego programu Java as -

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

Przez większość czasu, to będzie działać moja powyższy program poprzez linię poleceń jako runnable słoik jak ta -

java -jar abc.jar config.properties 

Moje pytania są -

  • Czy istnieje sposób na zastąpienie powyższych atrybutów w pliku właściwości za pomocą wiersza poleceń bez dotykania pliku, jeśli jest to konieczne? Ponieważ nie chcę modyfikować mojego pliku config.properties zawsze, gdy potrzebuję zmienić dowolną wartość atrybutu? Czy to się da zrobić?

Coś takiego powinno zastąpić wartość hostName w pliku?

java -jar abc.jar config.properties hostName=machineB.domain.host.com 
  • A także, czy jest jakiś sposób, aby dodać --help podczas pracy że może nam powiedzieć więcej o tym, jak uruchomić plik jar i co robi każdy oznacza majątek i jak z nich korzystać? Widziałem --help podczas uruchamiania większości plików wykonywalnych C++ lub Uniksa, więc nie wiem, jak możemy zrobić to samo w Javie?

Czy muszę użyć parsera CommandLine dla tego w Javie, aby osiągnąć obie rzeczy?

+3

To wtedy skorzystać z następujących 'String [] args' przekazany do' public static void metoda main' zmiennej. –

+0

@LuiggiMendoza Dzięki za sugestię. Czy możesz podać przykład jak to zrobić? Muszę też dodać funkcjonalność '--help', dzięki której każdy może dowiedzieć się, jak uruchomić ten słoik i jakie są różne parametry konfiguracyjne i co one oznaczają w ogóle? Czy potrzebujemy użyć dowolnego parsera wiersza poleceń, takiego jak JCommander? – john

+0

Można to zrobić ręcznie lub użyć takiej biblioteki. Decyzja należy do ciebie (lub twojego zespołu). –

Odpowiedz

2

Jeżeli tylko rzeczy będziesz mieć na swoim poleceń są takie rzeczy jak: hostName=machineB.domain.host.com a nie jakiekolwiek inne rodzaje argumentów, to można uprościć poleceń obsługi sporo:

pierwsze, dołącz wszystkie wiersza poleceń args z nowej linii, tak jakby były one nowy plik konfiguracyjny:

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

teraz masz dwa źródła Rzeczowe plik, a ten ciąg. Można załadować je zarówno do pojedynczej instancji Properties, jedna wersja z zastąpieniem drugiego:

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

Wielkie dzięki za pomoc. Co z moim drugim pytaniem? Jak mógłbym podejść do tego. Dowolny pomysł? – john

+0

CommandLine jest powszechnie używana do tego. Ja (lata temu) napisałem własną, że firma, w której pracuję, jest właścicielem, więc nie mogę się nią podzielić. Zobacz tutaj Apache CLI: http://commons.apache.org/proper/commons-cli/ – rolfl

Powiązane problemy