I have a program which will read everything from config.properties
file if command line does not contain any arguments apart from config.properties file location. Below is my config.properties file-
NUMBER_OF_THREADS: 100
NUMBER_OF_TASKS: 10000
ID_START_RANGE: 1
TABLES: TABLE1,TABLE2
If I am running my program from the command prompt like this-
java -jar Test.jar "C:\\test\\config.properties"
It should read all the four properties from the config.properties
file. But suppose if I am running my program like this-
java -jar Test.jar "C:\\test\\config.properties" 10 100 2 TABLE1 TABLE2 TABLE3
then it should read all the properties from the arguments and overwrite the properties in config.properties file.
Below is my code which is working fine in this scenario-
public static void main(String[] args) {
try {
readPropertyFiles(args);
} catch (Exception e) {
LOG.error("Threw a Exception in" + CNAME + e);
}
}
private static void readPropertyFiles(String[] args) throws FileNotFoundException, IOException {
location = args[0];
prop.load(new FileInputStream(location));
if(args.length >= 1) {
noOfThreads = Integer.parseInt(args[1]);
noOfTasks = Integer.parseInt(args[2]);
startRange = Integer.parseInt(args[3]);
tableName = new String[args.length - 4];
for (int i = 0; i < tableName.length; i++) {
tableName[i] = args[i + 4];
tableNames.add(tableName[i]);
}
} else {
noOfThreads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS").trim());
noOfTasks = Integer.parseInt(prop.getProperty("NUMBER_OF_TASKS").trim());
startRange = Integer.parseInt(prop.getProperty("ID_START_RANGE").trim());
tableNames = Arrays.asList(prop.getProperty("TABLES").trim().split(","));
}
for (String arg : tableNames) {
//Some Other Code
}
}
Problem Statement:-
Now what I am trying to do is- Suppose if any person is running program like this
java -jar Test.jar "C:\\test\\config.properties" 10
then in my program, it should overwrite noOfThreads
only-
noOfThreads should be 10 instead of 100
And suppose if that person is running program like this-
java -jar Test.jar "C:\\test\\config.properties" 10 100
then in my program, it should overwrite noOfThreads
and noOfTasks
only-
noOfThreads should be 10 instead of 100
noOfTasks should be 100 instead of 10000
And possible other use cases as well.
Can anyone suggest me how to achieve this scenario? Thanks for the help
When defining command line input as follows
java -jar Test.jar "C:\\test\\config.properties" 10 100
It means one must always provide
noOfThreads
to overridenoOfTasks
.To solve this you could specify these as system properties on command line along with file location which other wise has a default location too. For example: -
java -jar -Dconfig.file.location="C:\\test\\config.properties" -DNUMBER_OF_THREADS=10 Test.jar
Then.
Properties
.System.getProperty()
.This way no matter how many new properties you introduce your code will always remain same.
You can go step further and encapsulate all of this in a
PropertyUtil
that also provide utility methods likegetIntProperty()
,getStringProperty()
etc.Examples.
config.properties
To override
NUMBER_OF_THREADS
.java -jar -Dconfig.file.location="C:\\test\\config.properties" -DNUMBER_OF_THREADS=10 Test.jar
Short hand example to read 'NUMBER_OF_THREADS' as int.
Create a loop, instead.
Then as per your command line arguments set the individual properties as :
This won't overwrite the existing config.properties file.