Step 1. Create a property file under src/main/resources. In my case it's called primefaces-extensions.properties and consists of only one line.
application.version=${project.version}
Placeholder ${...} gets resolved at project build time. Maven also exposes other project properties like ${project.artifactId}, ${project.name}, etc. Please refer Maven properties guide. Not only Maven self exposes such properties. Various Maven plugins as buildnumber-maven-plugin and maven-svn-revision-number-plugin expose useful properties too.Step 2. To get placeholders replaced you need to enable filtering in your pom.xml.
<build>
<resources>
<resource>src/main/resources</resource>
<filtering>true</filtering>
</resources>
...
</build>
Step 3. Access in Java is simple. I have created a singleton class VersionProvider for that (because I only have one placeholder for project version). Project version is cached after the first access.
public final class VersionProvider {
private static final Logger LOGGER = Logger.getLogger(VersionProvider.class.getName());
private static final VersionProvider INSTANCE = new VersionProvider();
private String version;
private VersionProvider() {
ResourceBundle rb;
try {
rb = ResourceBundle.getBundle("primefaces-extensions");
version = rb.getString("application.version");
} catch (MissingResourceException e) {
LOGGER.warning("Resource bundle 'primefaces-extensions' was not found or error while reading current version.");
}
}
public static String getVersion() {
return INSTANCE.version;
}
}
Step 4. Using in any places is simple as well. Just call VersionProvider.getVersion(). For instance in the following JSF listener class
public class PostConstructApplicationEventListener implements SystemEventListener {
private static final Logger LOGGER = Logger.getLogger(PostConstructApplicationEventListener.class.getName());
@Override
public boolean isListenerForSource(final Object source) {
return true;
}
@Override
public void processEvent(final SystemEvent event) {
if (StringUtils.isNotBlank(VersionProvider.getVersion())) {
LOGGER.log(Level.INFO, "Running on PrimeFaces Extensions {0}", VersionProvider.getVersion());
}
}
}
or in JSF resource handlerpublic class PrimeFacesExtensionsResource extends ResourceWrapper {
private Resource wrapped;
private String version;
public PrimeFacesExtensionsResource(final Resource resource) {
super();
wrapped = resource;
// get current version
if (StringUtils.isNotBlank(VersionProvider.getVersion())) {
version = "&v=" + VersionProvider.getVersion();
} else {
version = UUID.randomUUID().toString();
}
}
@Override
public String getRequestPath() {
return super.getRequestPath() + version;
}
...
}
With resource filtering you don't need to care about available current project infos in Java programs.
I have no words for this great post such a awe-some information i got gathered. Thanks to Author.
ReplyDeleteI am using Maven 3.0.4 and it seems that resource dir should be inside src/main/resources otherwise you may get "Malformed POM" error.
ReplyDeleteAt previous comment: inside "directory" XML tag
ReplyDelete<build>
ReplyDelete<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>