How to declare a namespace, require Clojure libraries, and import Java classes in an idiomatic ns form.
Namespaces in Clojure are like Java packages, but they hold vars (functions and values), not classes. You usually configure a file’s namespace once at the top with ns.
ns Form You’ll See Everywhere1(ns myapp.core
2 (:require [clojure.string :as str]
3 [myapp.util :as util])
4 (:import [java.time Instant]))
What this means in practice:
:require loads other Clojure namespaces (your code or libraries).:as gives you a short alias so calls are explicit: str/join, util/parse-int, etc.:import brings Java classes into scope so you can write Instant/now instead of java.time.Instant/now.You can always skip :import and use the fully-qualified class name:
1(java.time.Instant/now)
:refer (Use Sparingly)1(:require [clojure.string :refer [join split]])
refer can be convenient for a small, stable set of names, but aliases are usually clearer. Avoid :refer :all in production code because it hides where names come from and makes conflicts harder to spot in review.
During development you’ll often reload a namespace after changes:
1(require 'myapp.core :reload)
Most editors also provide a “reload namespace” command.
Namespace names map to file paths:
myapp.core → src/myapp/core.cljmy-app.core → src/my_app/core.clj