Often times when writing a library to be used by many clients (servers, mobile apps), the programmer is faced with the following feature: making it configurable by implementing an intermediate layer which alters its
functionallity. This is a small tutorial about how to override properties files from jar dependency.
Let's take for example a library for http calls which consumes an api. The programmer using this sdk may want to change the url of the api, the port, client validation tokens, or default credentials.
One way of implementing the before mentioned layer is through properties files. Create a file named config.properties and place it under resources directory.
You can put in it the options to be overridden. Example:
application.auth.appid=<generated_app_id> application.auth.appkey=<generated_app_key> application.auth.useragent=App Java Client application.auth.serverurl=<api_url>
The file must be placed in the classpath. Make sure the resources directory is present in maven file. If not add under resources tag the following:
<resource> <directory>relative_path_to_file_here</directory> </resource>
This will include the file when building the jar which means you now have some default properties.
Reading the properties file is done through:
Properties prop = new Properties(); String propFileName = "config.properties"; try{ InputStream inputStream = Config.class.getClassLoader().getResourceAsStream(propFileName); if (inputStream != null) { prop.load(inputStream); } else { throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath"); } appId = prop.getProperty("application.auth.appid"); appKey = prop.getProperty("application.auth.appkey"); userAgent = prop.getProperty("application.auth.useragent"); serverUrl = prop.getProperty("application.auth.serverurl"); inputStream.close(); } catch(IOException e){ e.printStackTrace(); }
In android studio you can include the library as usual with gradle: compile 'groupId:artifactId-version' (the variables can be extracted from the maven build file).
If you try to create a file with the same name: config.properties, which will contain the new configuration and place it under assets, res or raw, it will be included in the apk under folders with same name. Since the apk is just an archive you can open it with a zip client to explore the contents and check where the file is placed.
What we want is to include it in the root path of the apk. To do that, create a directory named "resources" under /src/main path and place the new file there. You have now a fully configurable sdk. Congratulations.
To understand more about class loaders and how resources are loaded, read the following:
http://www.javaworld.com/article/2077260/learn-java/learn-java-the-basics-of-java-class-loaders.html
http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html
Photo source: https://www.flickr.com/photos/uncalno/8538679708