如何使用lein do test, uberjar, pom命令构建可运行Clojure程序
核心问题
你现在混用了Leiningen和Maven两套独立的构建体系,这是打包失败的根本原因:
lein do test, uberjar, pom的执行逻辑是读取项目根目录下的project.clj配置跑测试、打uberjar,最后根据project.clj的配置生成pom.xml,不会读取你手动编写的pom.xml内容- 你手动在pom.xml中添加的Clojure依赖、项目元数据配置,Leiningen执行打包时完全不会识别,最终输出的jar包自然无法按预期运行
- 如果确定要基于Maven做项目构建,那Leiningen相关的命令完全不需要使用
方案1:使用Leiningen构建(新手优先选,配置成本最低)
放弃手动维护pom.xml,在项目根目录创建project.clj作为构建配置文件,最小可用配置参考:
(defproject 你的groupid/你的artifactid "0.1.0-SNAPSHOT" ; 替换成你自己的项目标识和版本号 :dependencies [[org.clojure/clojure "1.11.1"]] :main ^:skip-aot 你写程序入口的命名空间 ; 替换成实际包含-main函数的命名空间名 :profiles {:uberjar {:aot :all}})
配置完成后注意两个必填项:
- 作为入口的命名空间头部必须加
(:gen-class)声明 - 入口命名空间中必须定义
-main函数作为程序执行入口
之后直接执行lein uberjar即可完成测试、打包流程,输出的standalone jar包会存放在target目录下,直接用java -jar target/{artifactid}-{version}-standalone.jar命令就能运行。
方案2:必须使用Maven构建的配置方式
完全弃用Leiningen相关命令,通过maven-shade-plugin打包可执行fat jar,在你现有的pom.xml的<build>节点下添加如下插件配置:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>你的入口命名空间</Main-Class> <!-- 替换成实际的入口命名空间 --> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins>
配置完成后执行mvn package即可完成打包,输出的jar包存放在target目录,可直接通过java -jar命令运行。
本地开发适配
你当前使用的IntelliJ IDEA + Cursive插件开发模式,只要在导入项目时选择根目录下的构建配置文件(project.clj对应Leiningen项目,pom.xml对应Maven项目),Cursive会自动识别依赖、支持直接在IDE内运行代码,和部署打包流程互不影响。
内容的提问来源于stack exchange,提问作者Iamblond
相关产品推荐
相关产品推荐

