Simple answer: start here
http://clojure.org/compilation
Longer answer:
You need to remember that Java "functions" all have this passed as a first argument so typically when you have
String foo(String greeting) { ... } in Java, you're going to have something like (defn -foo ^String [this ^String greeting] ...) in Clojure. -foo tells the Clojure compiler to preserve the function name when generating bytecode.
In your namespace declaration, you'll specify :gen-class to indicate you want the namespace compiled to a Java class.
As an example, here's a log4j appender we wrote at World Singles (with irrelevant bits omitted):
Running lein compile will geneate all the .class files, then lein uberjar will create a standalone JAR (containing the Clojure runtime) which you can deploy like any other JAR file. If you've already added the Clojure JAR to your classpath, you can just use lein jar and deploy the smaller, non-standalone JAR.
FWIW, the above dynamically resolves the save-row function at runtime so we avoid circular loader dependencies (because worldsingles.data.core relies on clojure.tools.logging which needs this AOT class at initialization time). worldsingles.data.core is our mini-ORM which supports CRUD operations on MySQL (via clojure.java.jdbc) and on MongoDB (via CongoMongo) transparently. The elided part of -append also conditionally writes to either :actionLog or :log after some data manipulation. :actionLog and :log represent tables in a MySQL database. :logging is a MongoDB collection off in the cloud. The nice thing about MongoDB is it can store fairly arbitrary Clojure data structures (serialized to BSON - a Binary JSON format) whereas the data structures have to be flattened for MySQL.