Apache Karaf on Vagrant (example Vagrantfile)
January 13, 2016
If you have a team developing OSGi applications for Apache Karaf, Vagrant provides an easy way to ensure everyone is testing local deployments in a consistent context. Vagrant is a little like Docker, using a layered approach to build up virtual environments. In this case, we create an Ubuntu “box”, running on a VirtualBox VM, and automatically set it up with everything necessary for Karaf testing.
Notes and caveats:
- This Vagrantfile is meant to be dropped into the root of your project. When run, Vagrant will automatically mount that project directory to /vagrant in the VM. This is handy since the bundle JAR, available in “target” (assuming Maven), is now visible to the VM and can be directly installed in Karaf.
- Once in a while, you’ll see a Vagrantfile install a desktop, IDE, etc. and allow that to be used for actual development. I’d highly advise against that. It’s more typical, and far more performant, to do development locally, then use Vagrant purely as a DEV testing environment.
- Ubuntu was arbitrarily chosen — I tend to prefer Debian-based distros, but this could work with any base box.
- I rely on a PPA to install Oracle Java 8. Realistically, I should switch this to OpenJDK.
- Allocating 4 GB of memory was also arbitrary. It’s overkill for simple needs, but may need bumped up for large applications.
- VT-x must be enabled in your BIOS for all CPU modes! Without it, VirtualBox will fail to run the VM.
- A workaround is required for Vagrant 1.8.1 on Windows. See the comment in the Vagrantfile.
The goods:
# -*- mode: ruby -*-
# vi: set ft=ruby :
#########################################################################
# INSTRUCTIONS
#
# 1.) Build your project, locally, either with your IDE or the command line.
# 2.) vagrant up
# 3.) vagrant ssh
# 4.) karaf
# 5.) If your project has a Karaf feature, install with:
# feature:repo-add file:/vagrant/features.xml (assumes the root of the project)
# Alternatively, install the bundle, also using file:/vagrant/.../yourproject.jar
# 6.) feature:install [feature name]
# or
# bundle:start [bundle #]
# 7.) When you're done, Ctrl+D to exit Karaf console.
# 8.) During development, before you boot Karaf back up, it's a good idea to blow away its "data" directory (contains
# logs, cache of all running bundles, etc.). An alias is setup: "karafClean". Then, redo #5-#6.
#########################################################################
#########################################################################
# NOTE: VT-x must be enabled in the BIOS for all CPU modes!
#########################################################################
#########################################################################
# BUG FIX FOR VAGRANT 1.8.1 ON WINDOWS
#
# If 'vagrant up' gives you a "chown: changing ownership of ‘/vagrant’: Not a directory" error, change the
# windows_unc_path() method in C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.1\lib\vagrant\util\platform.rb to:
#
# def windows_unc_path(path)
# path = path.gsub("/", "\\")
#
# # If the path is just a drive letter, then return that as-is
# return path if path =~ /^[a-zA-Z]:\\?$/
#
# # Convert to UNC path
# path
# end
#
# Discussed here: https://github.com/mitchellh/vagrant/issues/5933
#########################################################################
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
vb.gui = false
# Customize the amount of memory on the VM:
vb.memory = "4096"
end
config.vm.provision "shell", inline: <<-SHELL
sudo echo "LANG=en_US.UTF-8" >> /etc/environment
sudo echo "LANGUAGE=en_US.UTF-8" >> /etc/environment
sudo echo "LC_ALL=en_US.UTF-8" >> /etc/environment
sudo echo "LC_CTYPE=en_US.UTF-8" >> /etc/environment
# Java 8
# I was hesitant at first to rely on a PPA, but webupd8 appears to be legit and widely used.
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
sudo apt-get -y upgrade
# Automatically accept Oracle's license agreement prompts
echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
sudo apt-get -y install oracle-java8-installer
# Java env vars
sudo echo "export JAVA_HOME=/usr/lib/jvm/java-8-oracle" >> /home/vagrant/.bashrc
echo "export JDK_HOME=/usr/lib/jvm/java-8-oracle" >> /home/vagrant/.bashrc
# Apache Karaf 4.0.3
sudo wget -O /opt/apache-karaf-4.0.3.tar.gz http://supergsego.com/apache/karaf/4.0.3/apache-karaf-4.0.3.tar.gz
sudo tar -zxvf apache-karaf-4.0.3.tar.gz -C /opt
chmod -R 777 /opt/apache-karaf-4.0.3
echo "export PATH=$PATH:/opt/apache-karaf-4.0.3/bin" >> /home/vagrant/.bashrc
echo "alias karafClean='rm -rf /opt/apache-karaf-4.0.3/data'" >> /home/vagrant/.bashrc
SHELL
end