Leiningen构建工具 #

一、Leiningen简介 #

Leiningen是Clojure最流行的构建工具和项目管理工具,类似于Java的Maven或Node.js的npm。

1.1 主要功能 #

  • 项目创建
  • 依赖管理
  • 编译构建
  • 测试运行
  • 打包部署

1.2 安装 #

bash
brew install leiningen

lein version

二、项目创建 #

2.1 创建新项目 #

bash
lein new my-project

lein new app my-app

lein new plugin my-plugin

lein new template my-template

2.2 项目结构 #

text
my-project/
├── project.clj
├── README.md
├── resources/
├── src/
│   └── my_project/
│       └── core.clj
└── test/
    └── my_project/
        └── core_test.clj

2.3 project.clj #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :description "My Clojure Project"
  :url "https://example.com"
  :license {:name "MIT"
            :url "https://opensource.org/licenses/MIT"}
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :main my-project.core)

三、依赖管理 #

3.1 添加依赖 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.11.1"]
                 [ring/ring "1.9.6"]
                 [compojure/compojure "1.6.2"]
                 [cheshire/cheshire "5.11.0"]])

3.2 开发依赖 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :profiles {:dev {:dependencies [[midje "1.10.5"]
                                  [clj-kondo "2023.01.20"]]}})

3.3 查看依赖树 #

bash
lein deps :tree

lein deps :tree :profiles

3.4 检查过期依赖 #

bash
lein ancient

四、常用命令 #

4.1 运行 #

bash
lein run

lein run -m my-project.core

lein run -m my-project.core arg1 arg2

4.2 REPL #

bash
lein repl

lein repl :headless

lein repl :connect

4.3 测试 #

bash
lein test

lein test my-project.core-test

lein test :only my-project.core-test/test-name

4.4 编译 #

bash
lein compile

lein clean

lein uberjar

4.5 检查 #

bash
lein check

lein lint

五、配置详解 #

5.1 基本配置 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :description "Project description"
  :url "https://example.com"
  :license {:name "MIT"
            :url "https://opensource.org/licenses/MIT"}
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :source-paths ["src"]
  :test-paths ["test"]
  :resource-paths ["resources"])

5.2 JVM选项 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :jvm-opts ["-Xmx1g" "-server"]
  :javac-options ["-target" "11" "-source" "11"])

5.3 主函数 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :main my-project.core)

5.4 全局配置 #

~/.lein/profiles.clj:

clojure
{:user {:plugins [[lein-ancient "0.7.0"]
                  [lein-cljfmt "0.8.0"]]
        :dependencies [[clj-kondo "2023.01.20"]]}}

六、Profiles #

6.1 定义Profiles #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :profiles {:dev {:dependencies [[midje "1.10.5"]]
                   :source-paths ["dev"]}
             :test {:dependencies [[clj-test "0.4.0"]]}
             :uberjar {:aot :all}})

6.2 使用Profiles #

bash
lein with-profile dev repl

lein with-profile test test

lein with-profile uberjar uberjar

6.3 合并Profiles #

bash
lein with-profile dev,test test

七、插件 #

7.1 安装插件 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :plugins [[lein-ring "0.12.1"]
            [lein-cljfmt "0.8.0"]])

7.2 常用插件 #

插件 用途
lein-ring Web应用
lein-cljfmt 代码格式化
lein-kibit 代码优化建议
lein-ancient 检查过期依赖
lein-codox 文档生成

7.3 插件配置 #

clojure
(defproject my-project "0.1.0-SNAPSHOT"
  :plugins [[lein-ring "0.12.1"]]
  :ring {:handler my-project.handler/app
         :port 3000})

八、打包部署 #

8.1 JAR打包 #

bash
lein jar

lein uberjar

8.2 运行JAR #

bash
java -jar target/my-project-0.1.0-standalone.jar

8.3 部署到Clojars #

clojure
(defproject my-project "0.1.0"
  :description "My Library"
  :url "https://example.com"
  :license {:name "MIT"}
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :repositories [["clojars" "https://clojars.org/repo"]])
bash
lein deploy clojars

九、实践示例 #

9.1 Web项目 #

clojure
(defproject web-app "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.11.1"]
                 [ring "1.9.6"]
                 [compojure "1.6.2"]
                 [hiccup "2.0.0-RC1"]]
  :plugins [[lein-ring "0.12.1"]]
  :ring {:handler web-app.handler/app}
  :profiles {:dev {:dependencies [[ring/ring-mock "0.4.0"]]}})

9.2 库项目 #

clojure
(defproject my-lib "0.1.0"
  :description "A useful library"
  :url "https://github.com/user/my-lib"
  :license {:name "MIT"
            :url "https://opensource.org/licenses/MIT"}
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :profiles {:dev {:dependencies [[clj-test "0.4.0"]]}})

9.3 命令行工具 #

clojure
(defproject cli-tool "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.11.1"]
                 [cli-matic "0.4.3"]]
  :main cli-tool.core
  :uberjar-name "cli-tool.jar"
  :profiles {:uberjar {:aot :all}})

十、常见问题 #

10.1 依赖冲突 #

bash
lein deps :tree

lein deps :check

10.2 缓存清理 #

bash
lein clean

rm -rf .lein-deps-sum
rm -rf .cpcache

10.3 版本问题 #

bash
lein version

lein upgrade

十一、总结 #

Leiningen常用命令:

命令 用途
lein new 创建项目
lein run 运行项目
lein repl 启动REPL
lein test 运行测试
lein uberjar 打包
lein deps :tree 查看依赖

关键点:

  1. Leiningen是Clojure标准构建工具
  2. project.clj是项目配置核心
  3. Profiles管理不同环境配置
  4. 插件扩展功能
  5. uberjar打包独立应用

下一步,让我们学习项目结构与实践!

最后更新:2026-03-27