Contents
Goals
- Provide a way for ros people to build, package and use rosjava packages
- integrate rosjava with the other ros tools like roslaunch etc.
- Also provide a way for non-ros people to just pull rosjava binaries for linking their own projects to a ros robot.
- They shouldn't need to use the ros build environment - make maven repositories accessible for them.
Build Tools
The rosjava build environment uses a mixture tools and while these are familiar to most java people, they are probably not to many ros roboticists so an explanation of how they fit together here is worthwhile.
Java
Java support at the moment is for the supported openjdk on the ros ubuntu platforms of reference. At the moment this is openjdk-7, but you are likely to find that it work on other java implementations as well as it doesn't use anything especially esoteric.
Gradle
Gradle is the tool used for managing single and multiple java project builds. CMake would be its equivalent for C++ projects. It provides a powerful scripting language as well as plugin support for a variety of modules and extensions.
Gradle's scope for rosjava builds extends to our concept of a stack. It will usually control the compilation and assembly of several related software packages.
There are also a couple of ros-specific gradle plugins in rosjava_bootstrap that pull common gradle scripting logic into a centralised place for rosjava projects. This is very much like the catkin cmake api.
There are of course other options for the java build environment, however gradle is a good fit for us because of the natural power of the scripting language it uses as well as being the new default build tool for android projects.
Maven
Where to store the binary results of a gradle build? How to handle system dependencies (aka rosdeps)? This is where maven comes in. It is a fully cross platform solution that lets you retrieve and deploy java dependencies. It can be locally on your filesystem, in a github repo, on a private server, or on the official MavenCentral repository of all things java.
We currently utilise a mix of repositories, some on the filesystem, some in the cloud:
/opt/ros/indigo/share/maven : installed via ubuntu debian rosjava packages
./devel/share/maven : devel workspace repo for source builds
./install/share/maven : install workspace repo for source installs
github repository : an external repository for our own dependencies or when none of the above are accessible
MavenCentral : standard java dependencies (need to move more of our deps here).
Catkin
We use catkin only very minimally. It's role is to provide ros package information and be the glue that sequences builds across multiple repositories, possibly maintained by different people.
Utilise package.xml for version and dependency information.
- Relay build steps of a single package to gradle
The last part is important - gradle can't do this very easily on its own without alot of infrastructure.
Debian Packages
Debian packages are simply a way of conveniently managing the following things that were previously not possible in the rosjava world pre-hydro. Some more detailed information can be found in the Rolling RosJava Debs Tutorial.