Script Analytics

2015/12/09

Install docker-machine in your Boot2Docker VM

Boot2Docker still has a non-persistent filesystem.
The following commands will download docker-machine and install it in /usr/local/bin at each image start.

Once again, we will modify the /var/lib/boot2docker/bootlocal.sh file :
sudo vi /var/lib/boot2docker/bootlocal.sh
We add the following commands to automatically install docker-machine 0.5.2 :
# install docker machine
curl -L https://github.com/docker/machine/releases/download/v0.5.2/docker-machine_linux-amd64.zip > machine.zip && \
   unzip machine.zip && \
   rm -f machine.zip && \
   sudo mv -f docker-machine* /usr/local/bin

Install docker-compose in your Boot2Docker VM

Since Boot2Docker uses Tiny Core Linux, which runs from RAM, it does not persist filesystem changes by default.
The following commands will download docker-compose and install it in /usr/local/bin at each image start.

Once again, we will modify the /var/lib/boot2docker/bootlocal.sh file :
sudo vi /var/lib/boot2docker/bootlocal.sh
We add the following commands to automatically install docker-compose 1.5.0 :
# install docker-compose
curl -L https://github.com/docker/compose/releases/download/1.5.0/docker-compose-`uname -s`-`uname -m` | \
  sudo tee /usr/local/bin/docker-compose > /dev/null && \
  sudo chmod +x /usr/local/bin/docker-compose

2015/11/09

Auto-mount Windows folder to Boot2Docker VM

Boot2Docker is a simple VM used to run Docker in Windows.
With Docker-Machine, you are able to run Docker container inside the Boot2Docker VM from your Windows CMD.
And Everything is bundled into Docker Toolbox.


However, It can be annoying to execute shell scripts inside the Boot2Docker VM then retrieve everything on the Windows FS to finally build the Docker image.
In order to simplify my docker workflow and do everything inside the VM, I wanted to have access to my windows workspace from the boot2docker VM.

2014/02/10

How to test exception with JUnit

Testing that an exception has been thrown in JUnit test was painfull until I discovered ExpectedException rule.
Here is a brief overview of exception test mechanisms available in JUnit.

2013/07/05

Dandelion-Datatables integration with Grails

Dandelion-DataTables Logo
"Dandelion-DataTables is a component of the free and Open Source web framework Dandelion. It allows you to quickly create full-featured HTML table based on the amazing DataTables jQuery plugin."
It provides two ways to use the library : JSP taglib or Thymeleaf dialect.

Grails Logo
"Grails is an Open Source, full stack, web application framework for the JVM. It takes advantage of the Groovy programming language and convention over configuration to provide a productive and stream-lined development experience."
Grails works both with GSP (Groovy Server Page) and JSP.

2012/12/22

How to debug a remote Java application

It is not worth an entry but... I always forgot how to remotely debug a jvm :

Firstly, jvm options :
-Xdebug : Enables debugging support in the VM
-Xrunjdwp:<options> : Loads in-process debugging libraries and specifies the kind of connection to be made (Xrunjdwp parameters)
I use -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

2012/07/04

JDOM 2.X and Maven

I was asked to contribute to a side project at work. This small java project should handle XML file from an external repository, modify and reinject them in an ETL.

XML and Java ? A tumultuous love story...
Since I am not a big fan of JAXP and SAX, I searched for another XML manipulation library and found JDOM.
JDOM is a powerful Java library which aim to ease XML manipulation. It was once included in JSR 102 however the JSR is now withdrawn (more information can be found in the JDOM mailing list).

Since it is not the main purpose, if you want to learn more about the library there is a great primer writen in github wiki's page : https://github.com/hunterhacker/jdom/wiki/JDOM2-A-Primer

One of the downside of current JDOM version 2.0.2 is maven integration. When you want to include JDOM in your project, you add the following dependency :
<dependency>
  <groupId>org.jdom</groupId>
  <artifactId>jdom</artifactId>
  <version>2.0.2</version>
</dependency>
And JDOM pom.xml references those dependencies :
<dependencies>
  <dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.3</version>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.10.0</version>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>xalan</groupId>
    <artifactId>xalan</artifactId>
    <version>2.7.1</version>
    <optional>true</optional>
  </dependency>
</dependencies>


Now if you try to perform mvn install, you will face one of the following errors :
  • The following artifacts could not be resolved: maven-plugins:maven-cobertura-plugin:plugin:1.3, maven-plugins:maven-findbugs-plugin:plugin:1.3.1, Failure to find maven-plugins:maven-cobertura-plugin:plugin:1.3 in ...
This error is caused by a broken artifact on Jaxen 1.1.3. The work-around is to use the "exlusions" tags in order to avoid loading of unfound dependencies.
<dependency>
  <groupId>jaxen</groupId>
  <artifactId>jaxen</artifactId>
  <version>1.1.3</version>
  <optional>true</optional>
  <!-- http://jira.codehaus.org/browse/JAXEN-217 -->
  <exclusions>
    <exclusion>
      <groupId>maven-plugins</groupId>
      <artifactId>maven-cobertura-plugin</artifactId>
    </exclusion>
    <exclusion>
      <groupId>maven-plugins</groupId>
      <artifactId>maven-findbugs-plugin</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  • java.lang.ExceptionInInitializerError
        at org.jdom2.input.SAXBuilder.(SAXBuilder.java:338)
        at org.jdom2.input.SAXBuilder.(SAXBuilder.java:221)
        at [...]
    Caused by: java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
        at javax.xml.parsers.SAXParserFactory.setSchema(SAXParserFactory.java:421)
        at org.jdom2.input.sax.XMLReaders.(XMLReaders.java:122)
        at org.jdom2.input.sax.XMLReaders.(XMLReaders.java:95)
        ... 30 more
This error is caused by an old version of xercesImpl specified in the resolved dependencies. Once again, we will use the "exclusions" tag to avoid this error.
<dependency>
  <groupId>jaxen</groupId>
  <artifactId>jaxen</artifactId>
  <version>1.1.3</version>
  <optional>true</optional>
  <!-- Use JDK xerces version -->
  <exclusions>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
    </exclusion>
  </exclusions>
</dependency>
This should not work if your JDK is lesser than 1.5.


In summary, here is the depency set I currently use for JDOM 2.0.2 :
<dependency>
  <groupId>org.jdom</groupId>
  <artifactId>jdom</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
  <groupId>jaxen</groupId>
  <artifactId>jaxen</artifactId>
  <version>1.1.3</version>
  <exclusions>
    <!-- Use JDK xerces version -->
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
    </exclusion>
    <!-- http://jira.codehaus.org/browse/JAXEN-217 -->
    <exclusion>
      <groupId>maven-plugins</groupId>
      <artifactId>maven-cobertura-plugin</artifactId>
    </exclusion>
    <exclusion>
      <groupId>maven-plugins</groupId>
      <artifactId>maven-findbugs-plugin</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>xalan</groupId>
  <artifactId>xalan</artifactId>
  <version>2.7.1</version>
</dependency>