Java Garbage Collection Distilled by Martin Thompson
Thanks to Attila-Mihaly for giving me the opportunity to write a post for his yearly newsletter Java Advent Calendar, hence a review on various Java related topics fits the bill! The selection of videos and articles are purely random, and based on the order in which they came to my knowledge. My hidden agenda is to mainly go through them to understand and broaden my own knowledge at the same time share any insight with others along the way….read more (reblogged from the Java Advent Calendar)
How do we know “how it is being done” when we look at a product or even a code-base of a F/OSS project? In today’s high-speed, fast-paced software industry getting something out quick and earning lots points at the end of a sprint, is becoming a mainstream practise these days. If you want to make sure you are sticking to your Software Craftsmanship motto: “We do not want to ship s**t” like Uncle Bob very rightly says – then you have gotta find a better way to streamline your development process to achieve just that!
That’s when tools like SonarQube ™ (formerly known as Sonar ™) come to our rescue or at least help us in the interim to get a better understanding of what software metrics and software quality can mean for your team! How to compare progress on a timeline and use it to get quick feedback to assess and improve the quality of the code we write and maintain is certainly an important thing to be able to do.
Installing SonarQube on a Mac OS X system hasn’t been as smooth as on systems with a Linux/Unix environment hence this blog. With some tweaks, assistance from third-party sites and following the do-s and don’t-s you should be able to get long and successfully install SonarQube and SonarQube Runner!
As installing and configuring SonarQube is an involved process, a number of items need to be taken into consideration and they have been categorised below under the various topics and sub-topics. Hopefully this makes the journey easier for all of us – since we have done it once and it has been a bit painful, its here for everyone else’s benefit.
The below is a list of hardware/software installations are required to get success out of the instructions put together in this blog:
- Mac OS X Mountain Lion 10.8.4
- SonarQube 3.7 artefacts
- SonarQube Runner 2.3 artefacts
- MySQL 5.6.12
- JDK/JRE 1.7.0 or 1.8.0
These instructions have been performed on a system with the below configuration:
Model Name: MacBook Pro
Processor Name: Intel Core i7
Processor Speed: 2.3 GHz
Total Number of Cores: 4
Memory: 8 GB
HDD Capacity: 249.8 GB (SSD)
System Version: OS X 10.8.4
Java version: 1.8.0-ea-b103
Downloading, installing and configuring MySQL
A suitable MySQL binary can be downloaded from  or directly from .
Installing & configuring
MySQL must be present on the machine running SonarQube – which is the data store where all the relevant metrics per project are stored. To find out on how to go about installing MySQL on the Mac, please refer to the blog post How to install and configure MySQL on MacOS X for UTS . The below window is an indication of a successful installation (System Preferences > Other > MySQL – blue icon at the bottom of the window):
Once the installation is complete, the create SonarQube database SQL script will require to be run via the MySQL console or through another SQL client that can connect to the currently running MySQL server.
Command-line Interface (CLI)
There’s also a few other commands to know as part of daily MySQL operations:
(start the MySQL) $ sudo $MYSQL_HOME/bin/mysqld_safe & - or - $ sudo $MYSQL_HOME/support-files/mysql.server start & (restart the MySQL if its running) $ sudo $MYSQL_HOME/support-files/mysql.server restart & (stop the MySQL if its running) $ sudo $MYSQL_HOME/bin/mysqladmin shutdown & - or - $ sudo $MYSQL_HOME/support-files/mysql.server stop &
Where MYSQL_HOME was set to /usr/local/mysql (check if it is the same in your case) in the respective bash configuration file.
In order to not perform the above command on a regular basis, ensure that the Automatically Start MySQL Server on Startup is switched on.
Check if the database has been created correctly, by performing the below commands on the CLI (look for the highlighted database, you will also need to enter the root password for your MySQL server here):
$ mysql -u root -p mysql> show databases +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sonar | | test | +--------------------+
Installing & configuring JDK/JRE
JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre
Unzip the archive into a folder of your choice for e.g. the /opt/ folder. Once done, set the SONAR_HOME environment variable to point to this location, in the respective bash configuration file:SONAR_HOME = /opt/sonar-3.7/
Source the bash configuration file and perform the below actions to ensure that SonarQube can connect with the available MySQL database:
$ cd $SONAR_HOME/conf $ vim sonar.properties
- comment the derby configuration
- uncomment the mysql configuration,
- save the changes and close the file.
Also note SonarQube’s JDBC credentials are:
login: sonar password: sonar
By default the web port where SonarQube is listening, is set to 9000, which can be changed in the $SONAR_HOME/conf/sonar.properties file. Change the sonar.web.port property to another setting if port 9000 is being used by another application, i.e.
There’s one more place where this is defined and must be in sync with this file, see below in the settings.xml file – the line referring to …localhost:9000… which should be changed as well (to …localhost:9100… if the port settings in the $SONAR_HOME/conf/sonar.properties is also changed).
Install maven if it does not exists already (recent versions of the Mac OS X comes with maven installed), ensure it is included in system path i.e. PATH and run the below command at the CLI to verify this:
Check if the below maven options are set otherwise set the MAVEN_OPTS environment variable in the respective bash configuration files:
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
Finally put the settings.xml containing the below lines into the ./m2 folder (maven’s configuration folder):
<settings> <profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- Example for MySQL--> <sonar.jdbc.url> jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8 </sonar.jdbc.url> <sonar.jdbc.username>sonar</sonar.jdbc.username> <sonar.jdbc.password>sonar</sonar.jdbc.password> <!-- Optional URL to server. Default value is http://localhost:9000 --> <sonar.host.url> http://myserver:9000 </sonar.host.url> </properties> </profile> </profiles> </settings>
Upgrading SonarQube from the current 3.x.y to version 3.7
Upgrading to a newer version of SonarQube is as easy as downloading the latest binary and placing the expanded folder into the /opt/ folder or elsewhere on your system, updating the environment variables via the respective bash configuration files (see previous section).Restart SonarQube (see below section to know how to do that), wait for a couple of minutes, and finally run the database migration process by opening the below location via the browser and clicking on the Upgrade button:
…this should take few minutes and the databases should be migrated to the latest version.
Once finished, navigate to the web address http://localhost:9000/ to see the very familiar SonarQube dashboard (see below the screen-shot of the live SonarQube implementation i.e. Nemo  on as an example):
Once the dashboard has been been presented, log in by clicking on the Log in link on the top right corner of the browser window with the below credentials:
Running SonarQube via the CLI
Starting SonarQube from the CLI with the below command:
$ sudo $SONAR_HOME/bin/<b>macosx-universal-64</b>/sonar.sh <b>start</b>
or restarting it, if it is already running:
$ sudo $SONAR_HOME/bin/<b>macosx-universal-64</b>/sonar.sh <b>restart</b>
…stopping it is the same:
$ sudo $SONAR_HOME/bin/<b>macosx-universal-64</b>/sonar.sh <b>stop</b>
A few other parameters are available i.e. console, status and dump – SonarQube needs to be running in order for any of these to work, which you will find out very easily with the “sonar is not running.” message.
Note: MySql must be running when SonarQube is (re)started. In the above case it is assumed that SonarQube is installed in the /opt/ folder.
Download, install and configure SonarQube Runner
SonarQube can be setup to analyse projects through various ways, one of the other ways is to use SonarQube Runner, which requires a sonar-projects.properties file that would contain the basic definitions of the nature of the project. It is used in case the project to analyse is not maven project (does not have a pom.xml file).SonarQube Runner can be downloaded from the same location where the SonarQube binaries are kept .
Unzip the archive containing the binary for SonarQube Runner into a folder i.e. /opt/ folder and set the environment variable SONAR_RUNNER to this location in the respective bash configuration files.
SONAR_RUNNER = /opt/sonar-runner-2.3/
Checking SonarQube or SonarQube Runner
In particular $SONAR_HOME/logs/sonar.log contains SonarQube specific system level log messages.
$SONAR_HOME/bin $SONAR_RUNNER/bin $MYSQL_HOME/bin
Always source the bash configuration files after amending them.
Terminologies used bash configuration file --- $HOME/.bashrc -or- $HOME/.bash_profile CLI ---- command-line interface
 http://nemo.sonarqube.org/ (Live SonarQube implementation)
 http://docs.codehaus.org/display/SONAR/Plugin+Library (List of languages, plugins & tools supported by SonarQube)
These instructions are in principle similar to the steps for Ubuntu or other Unix/Linux based OSes – with some tweaks it should be possible to install and run SonarQube in such environments as well.
The terms Sonar and SonarQube have been used interchangeably in a number of places above. Some of it is due to the referred links not being updated, and others are due to the fact that scripts and program references have continued to be used with their original names to prevent issues with dependencies.
Do not take the settings, paths and file locations, url references, excetra mentioned in this blog literally, in some cases they would need to be adjusted to settings relevant to your environment.
Please note all the external links on this blog may or may not stay actual and is not feasible to maintain them as part of this blog post.
Please feel free to contribute to the above post in the form of constructive comments, useful links, additional information, excetra to improve the quality of the information provided. If something hasn’t worked for you and you have managed to make it work or have a work-around / alternative solution, please do share it with us!