5

Ho un file di proprietà che è come questo -Come sovrascrivere il valore del file delle proprietà tramite gli argomenti della riga di comando?

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

E ora sto leggendo il file di proprietà di cui sopra dal mio programma Java come -

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

maggior parte del tempo, mi sarà in esecuzione il mio programma di cui sopra attraverso la linea di comando come un barattolo eseguibile come questo -

java -jar abc.jar config.properties 

Le mie domande sono -

  • Esiste un modo per sovrascrivere gli attributi precedenti nel file di proprietà tramite la riga di comando senza toccare il file se necessario? Dal momento che non voglio modificare il mio file config.properties sempre ogni volta che ho bisogno di modificare qualsiasi valore di attributi? È possibile farlo?

Qualcosa di simile dovrebbe sovrascrivere il valore hostName nel file?

java -jar abc.jar config.properties hostName=machineB.domain.host.com 
  • E inoltre, c'è un modo per aggiungere --help durante l'esecuzione del che può dirci di più su come eseguire il file jar e che cosa ogni mezzo di proprietà e come usarli? Ho visto --help mentre eseguivo la maggior parte dell'eseguibile C++ o roba Unix quindi non sono sicuro di come possiamo fare la stessa cosa in Java?

Ho bisogno di utilizzare parser CommandLine per questo in Java per ottenere entrambe le cose?

+3

Questo è quando si fanno uso del 'String [] args' variabile passata a' metodo main' public static void. –

+0

@LuiggiMendoza Grazie per il suggerimento. Puoi fornire un esempio come farei questo? Devo anche aggiungere la funzionalità '--help' con cui chiunque può sapere come eseguire questo jar e quali sono i vari parametri di configurazione e cosa significano in generale? Dobbiamo usare qualche parser da riga di comando come JCommander? – john

+0

Puoi farlo manualmente o usare una libreria del genere. La decisione spetta a te (o alla tua squadra). –

risposta

2

Se le uniche cose che si avrà sulla vostra linea di comando sono cose come: hostName=machineB.domain.host.com e non altri tipi di argomenti, allora si può semplificare la linea di comando la gestione di un bel po ':

In primo luogo, unire tutte le riga di comando args con a capo come se fossero un nuovo file di configurazione:

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

ora, si hanno due fonti di proprietà, il file, e questa stringa. È entrambi possono essere caricati in una singola istanza Properties, con una versione sovrascrivendo l'altro:

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

Grazie mille rolfl per l'aiuto. E la mia seconda domanda? Come potrei avvicinarmi a quello. Qualche idea? – john

+0

CommandLine è comunemente usato per questo. Ho (anni fa) scritto da me che la società per cui lavoro è proprietaria, quindi non posso condividere. Vedi la CLI di Apache qui: http://commons.apache.org/proper/commons-cli/ – rolfl

Problemi correlati