# naughtmq NaughtMQ is a zero-config, zero-hassle way to use ZeroMQ with the JVM on the three major platforms (Linux, OS X, Windows). It currently bundles ZeroMQ 3.2.4 and jzmq 2.2.2. ## Disclaimer As the version number suggest, this is a very early, alpha-level release. Expect things to break. At the moment, I have been able to successfully run the example programs below (in a `lein uberjar`) on OS X, Linux x86 and Linux x86_64 (the same virtual machines as used for compiling, though on a clean slate), and on Windows XP x86. I do not have access to a 64-bit version of Windows for testing, though the package should work (Visual Studio allows for the compilation of 64bit binaries on a 32bit machine). ## Usage ### From Clojure To include this library in a Leiningen-based project, add this line to your dependencies: ```clojure [naughtmq "0.0.2"] ``` Then, in your main namespace, require or use the `naughtmq.core` namespace **before** you import `org.zeromq.ZMQ`. As Clojure loads Java classes on import, you have to structure your `ns` declaration such that `naughtmq` comes first. Here is a minimal example of a Clojure namespace using `naughtmq`: ```clojure (ns zmq-test.core (:require [naughtmq.core :as nc]) (:import [org.zeromq ZMQ])) (defn -main [& args] (println (ZMQ/getFullVersion))) ``` To allow for `org.zeromq.ZMQ` to be imported in the `ns` declaration, I have set `naughtmq.core` to load the native libraries upon compilation. This means that there is nothing else to do than `require`ing the namespace. ### From Java The jar is on [clojars](https://clojars.org/), so you will have to add: ```xml clojars.org http://clojars.org/repo ``` to your `pom.xml`, in addition to the dependency to this library: ```xml naughtmq naughtmq 0.0.2 ``` Java, in contrast with Clojure, does *not* actually load classes upon import. The JVM actually waits for the first use of a class to load it, which means that the usage for `naughtmq` is quite natural. Here is a minimal example: ```java package test.zmq.with.naught; import org.zeromq.ZMQ; // order does not matter here public class Main { // this line must appear before any ZMQ call static { naughtmq.Loader.load(); } public static void main(String[] args) { System.out.println(ZMQ.getFullVersion()); // ZMQ is loaded here // since the native libs have already been loaded by this point, // everything works. } } ``` ## How to build If you want to build the binaries yourself (for example because you need a different version of ZeroMQ), the process is, for the most part, easily reproducible. To build the OS X binaries on OS X, just execute the Rakefile in `resources/native/x86_64/mac`. To build the Linux binaries, any UNIX with [Rake](http://rake.rubyforge.org/) and [Vagrant](http://www.vagrantup.com/) will do (I have not made any extensive testing with other versions; I have used Vagrant 1.5.4; I believe 1.5 is mandatory for the [new boxes system](https://vagrantcloud.com/)). On Windows, I have no idea how to automate things. The build process is [quite straightforward](http://zeromq.org/bindings:java) if you have access to Visual Studio. ## License Copyright © 2014 Gary Verhaegen Distributed under the Eclipse Public License, the same as Clojure.