Software University Conference Presentation about Java 8

Posted by JOKe on 10/13/2014 12:09:00 PM in
This is video from the presentation I did for Software University  conf at Borovetz, Bulgaria.
And here is the presentation (slideshare) only.

I recommend to watch the previous video in my post bellow since it has more content (but I speak a bit faster there :) )


My Presentation about "Beyond new things in Java" which I held at javaday.bg event.

Posted by JOKe on 7/18/2014 08:24:00 PM in
My Presentation about "Beyond new things in Java" which I held at javaday.bg event, organized by trader.bg.


And this is the presentation only:



Patching a Maven library with your custom class.

Posted by JOKe on 7/18/2014 11:01:00 AM in
Sometimes you use a library that has a bug. Or maybe it doesn’t has a bug but you want to change something. Of course if it is an open source you can get the sources… build them … with your change and so on. However this first takes a lot of time and second you need the sources.
What you usually want .. is to just replace one class.. or few classes with something custom… maybe add a line .. or remove a line and so on.
Yesterday… I had an issue with jboss-logging. The version I was using was 3.2.0Beta1 and it turns out that using this version and log4j2 2.0 final basically meant that no log is send to log4j2. The reason was a null pointer exception that was catched in jboss logging class called Log4j2Logger. The bug I submitted is here https://issues.jboss.org/browse/JBLOGGING-107 and it was fixed at the same day. However I will use it as an example since I didn’t knew when this will be fixed.. and I didn’t want to wait till it is fixed.
So I was thinking what I want.. to take the jboss-logging  jar  and replace the file called Log4j2Logger. Basically as you can see in the bug I wanted to replace line 54 to be :
instead of :
this.logger.log(null, loggerClassName, translatedLevel,
parameters == null || parameters.length == 0 ? this.messageFactory.newMessage(message) :
this.messageFactory.newMessage(String.valueOf(message), parameters),
to become :
this.logger.log(translatedLevel, parameters == null || parameters.length == 0 ? this.messageFactory.newMessage(message) : this.messageFactory.newMessage(String.valueOf(message), parameters),

And that’s it. Of course I didn’t wanted to do this manually with zip Усмивка but to use maven as well.

So what I did:

1) I created a new maven project and added as dependency the jboss-logging.
2) I set the new project groupid and artifactid as the ones in the dependancy.
I set the version to be something like “3.2.0.Beta1-log4j2-npe-fix” so I added –log4j2-npe-fix
3) I used a plugin that takes the original version, unpacks the original jar in target WITHOUT the class I want to patch in this case Log4j2Logger.class and added my own implementation in the sources of my project.
4) And well thats all... ones I build.. my patched class will go in target.. and the original classes except the class I want to patch will also go in target and voala.. I will have a library which is patched.
The full pom.xml looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">


and that’s it.. the only thing left is to update my project to use my version 3.2.0.Beta1-log4j2-npe-fix instead of the original 3.2.0.Beta1.

I hope this will help to someone to save time.


spring-loaded rocks !

Posted by JOKe on 4/22/2014 09:37:00 PM

Today I found spring loaded (https://github.com/spring-projects/spring-loaded)

in short this is a java agent that enables class reloading of already running VM.

Simply this means zero deployment time (in many cases).

It is like a free and open source alternative of JRebel.

Spring Loaded allows you to add/modify/delete methods/fields/constructors. The annotations on types/methods/fields/constructors can also be modified and it is possible to add/remove/change values in enum types.

There is a preliminary java8 support. There is also another project DCEVM ( which is also great but supports only till JRE 6 update 26). More info here http://ssw.jku.at/dcevm/

But lets stop speaking and show you how it works.

In short you just need to pass the agent when starting the vm and that’s it.

>java -javaagent:D:/Downloads/springloaded-1.2.0.BUILD-20140409.201438-12.jar -noverify org.gochev.MainClass

I am using this Build since I am running Java 8 and this is currently the latest .

The code I in my simple app is the following:

A POJO like this :

package org.gochev;

public class DynamicReloadedClass {
private int age = 30;

public int getAge() {
return age;

public void setAge(int age) {
this.age = age;

and a MainClass like this:

package org.gochev;

import java.util.Scanner;

public class MainClass {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
while (true) {
System.out.println("test "
+ new DynamicReloadedClass().getAge());

So I can change the DynamicReloadedClass while the main method in the MainClass is looping. You can see this in action here :


Awesome ... and free ! 


Copyright © 2009 JOKe's Blog All rights reserved. Theme based on the Theme by Laptop Geek with changes by JOKe. | Bloggerized by FalconHive.