All three of them will by default not handle your code changes in real time.
- lein run: executes the -main function of the targeted or default namespace. Lein runs through out the full execution of that main methods so if your main function creates a web servers, then the leiningen process also stays up the whole time.
- lein trampoline: executes the -main function as a separate process, so that the main leiningen process can exit and therefore you only have one process running
- lein uberjar: creates a standalone jar file, so that any other user does not need to have lein installed to run your code. (or any of the source files). To run the jar, you execute java -jar myjarname.jar which contains all the source and all the dependencies.
If you are working with ring, then lein-ring has a development mode that can be started this way:
lein ring server
which will indeed to code reloading for you.
EDIT: which one to use in production ?
Assuming here that *production* means delivering a bundled version of your code to a user
Creating a jar with lein uberjar and make your final product independent of the build tool is usually the preferred way.