Monday, December 14, 2015

Some MAVEN BUILD Challenges

Today let's go through some of the learnings from maven build failure
Challenge 1)
testSet failed: java.lang.IllegalArgumentException: Language not supported in this application: Lang(en,IN) not in Lang.availables(), took 6.537 sec
[error] at play.mvc.Http$Context.setTransientLang(Http.java:238)
Solution
Make sure OS locale is correct one.
For example in Ubuntu localce can modify by editing the below file
/etc/default/locale

Challenge 2)
phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
Solution
phantomjs say no dependencies but it require fontconfig. Install this missing dependencies by using below command
sudo apt-get install libfontconfig

Challenge 3)
DockerException: Can't obtain ID from build output stream.
Solution
Normally due to network fluctuations it may happens, please retry and see.
Another cause of error is low memory availability for maven, we can set heap memory for maven as below ( would give it 2Gb of heap)
  • set MAVEN_OPTS=-Xmx2048m 
OS Memory leak may also lead unavailability of enough memory, In ubuntu noticed that after running dockers, memory are not released properly, please use below command to verify, in case if available memory is less we may need to consider rebooting of ubuntu as well.
free -m
NOTE: While retry always use the flag -rf, --resume-from
          Resume reactor from specified project
example: mvn <goals> -rf :redis-poc

Challenge 4)
Some of the sanity test cases fails and stuck to proceed with build, and don't want waste time on low priority fixes?
Solution
We can skip test cases by defining the property in pom.xml, say skipITs like below under the corresponding plugin.


<plugin>
  <executions>
    <execution>
        ....
        ....
        <configuration>
            <skip>${skipITs}</skip>
            <executable>.....

And use below build option.
mvn <goals> -DskipTests
example: mvn clean install -DskipTests=true
NOTE:Please do with extra caution, as we don't want to skip any major failures. 

Friday, November 6, 2015

java.lang.NoClassDefFoundError vs ClassNotFoundException

There is common missunderstanding between java.lang.NoClassDefFoundError & java.lang.ClassNotFoundException


Both seems to be same and most of us consider both as due to required class file not available in the class path.

If so, certainly java no need both, then why java have both?

If we look closely we can easily find a quick difference.

Yes! As we guessed one is Error & other one is Exception.

So what? What else?

Let me brief with below code.

Just try below code; it will be interesting to understand behavior of both scenarios.

public class ClassDefExceptionTest {
       static {
              ClassDefExceptionTest.init();
       }
       public ClassDefExceptionTest(){
             
       }
       private static void init(){
              //
              //Some useful code
              //
              throw new RuntimeException("Sorry you can't create this object");
       }
      
}

public class TestFun {
       public static void main(String a[]){
              ClassDefExceptionTest test = null;
              try{
               test = new ClassDefExceptionTest();
              }catch(Throwable e){
                    
                     e.printStackTrace();
              }
              
              try{
                      test = new ClassDefExceptionTest();
                      
              }catch(Throwable e){
                           e.printStackTrace();
              }
               

              try{
                 Class ctest = Class.forName("fhd.practise.ClassDefExceptionTest");
                 System.out.println("loaded successfully.."+ctest.getSimpleName());

                 ClassDefExceptionTest tobj = (ClassDefExceptionTest)ctest.newInstance();
                 System.out.println("Instance created successfully..");
              }catch(Throwable e){
                           e.printStackTrace();
              }
                  
         
     try{
              Class ctest = Class.forName("fhd.practise.ClassNoWhereAvailable");
           }catch(Throwable e){
                     e.printStackTrace();
                        }
  
       }
}



Any guess on output?

No yet guessed? Then please test above code and see :-)


java.lang.NoClassDefFoundError in web application most often developers get treat this error wrongly, as root cause java.lang.ExceptionInInitializerError generated long back and may scrolled up in the log. So developer assume particular class not reachable and waste time running behind it, we can’t blame developers just googlers, Since Googling mislead us as below.

NoClassDefFoundError means that the class is present in the classpath at Compile time, but it doesn't exist in the classpath at Runtime.

This is true in some scenario but not always.

NoClassDefFoundError can occur for multiple reasons like

•             ClassNotFoundException -- .class not found for that referenced class irrespective of whether it is available at compile time or not (i.e base/child class).
•             ExceptionInInitializerError -- Class file located, but Exception raised while initializing static variables or static blocks
•             ClassLoaders also may cause such error, which is basically ClassNotFoundException, in this scenario class may present in classpath but attempt to load from different ClassLoader

In a nut shell, when we face java.lang.NoClassDefFoundError follow the below 3 steps.


1.   Identify rout cause of such error by just scrolling above the logs and verify root cause is java.lang.ExceptionInInitializerError OR java.lang.ClassNotFoundException
Some scenario it is not possible to find none of the above as the server may start long back and logs got rotated from the system or it will be tedious task to go through tens of log files.

2.     Then next approach is locate the candidate class from the class path, if not available in anywhere in the class path then solution is simple, get required class or jar and add it to the class path :-)
Most of us wonder if particular class is available in the class path, what is wrong………….

Nothing!

Simply pay attention on static block/variable of particular class, definitely something wrong will be going on static block/variable 

3.     If above couldn’t help, Issue related will be with ClassLoader, which is basically ClassNotFoundException, in this scenario class may present in classpath but attempt to load from different ClassLoader. Which is also simple to fix but we should have clear idea about classloaders, let me explain it in the another blog