Car*_*ate 5 clojure executable-jar leiningen
我正在尝试使用 Intellij's Cursive 中的 Leiningen 插件从我的基本 Clojure 项目中制作一个独立的 jar。
为了创建项目,我只是创建了 project.clj 文件,将其打开,然后 Cursive 提出将其作为项目导入。
项目.clj:
(defproject WaterTimer "1"
:description "A timer that reminds you to drink water"
:main tone-producer/main)
Run Code Online (Sandbox Code Playgroud)
音调producer.clj:
(ns tone-producer
(:require [general-helpers :as g])
(:import [javax.sound.midi MidiSystem
Synthesizer
MidiChannel])
(:gen-class))
(defn main [& args]
(println "Test!"))
Run Code Online (Sandbox Code Playgroud)
当我运行“uberjar”任务时,我得到以下输出:
警告:指定 :main 而不将其包含在 :aot 中。:main 的隐式 AOT 将在 Leiningen 3.0.0 中删除。如果您的 uberjar 只需要 AOT,请考虑将 :aot :all 添加到您的 :uberjar 配置文件中。警告:jar 中不存在指定的 Main-Class。它可能无法按预期执行。包含 main 方法的命名空间中可能缺少 gen-class 指令。创建 C:\Users\slomi\IdeaProjects\WaterTimer\target\WaterTimer-1.jar 创建 C:\Users\slomi\IdeaProjects\WaterTimer\target\WaterTimer-1-standalone.jar
我还尝试将main函数更改为具有默认名称,并从以下名称中省略名称defproject:
(defproject WaterTimer "1"
:description "A timer that reminds you to drink water"
:main tone-producer)
(ns tone-producer
(:require [general-helpers :as g])
(:import [javax.sound.midi MidiSystem
Synthesizer
MidiChannel])
(:gen-class))
(defn -main [& args]
(println "Test!"))
Run Code Online (Sandbox Code Playgroud)
但现在我收到错误:
错误:无法找到或加载主类 clojure.main 编译失败:子进程失败
结构是:
任何指导在这里将不胜感激。
一番摆弄之后
(:require [general-helpers :as g]),因为没有必要演示这个问题:gen-class需要 AOT - 正如 Sanchayan 指出的
项目.clj
(defproject WaterTimer "0.0.1"
:description "A timer that reminds you to drink water"
:dependencies [[org.clojure/clojure "1.8.0"]] ;; <- [1]
:main tone-producer
:aot [tone-producer]) ;; <- [2]
Run Code Online (Sandbox Code Playgroud)
src/tone_ Producer.clj -在文件名中使用“_”而不是“-”
(ns tone-producer
(:import [javax.sound.midi MidiSystem
Synthesizer
MidiChannel])
(:gen-class))
(defn -main [& args]
(println "Test!"))
Run Code Online (Sandbox Code Playgroud)
结果:
$ lein uberjar
Compiling tone-producer
Compiling tone-producer
Created .../watertimer/target/WaterTimer-0.0.1.jar
Created .../watertimer/target/WaterTimer-0.0.1-standalone.jar
$ java -jar target/WaterTimer-0.0.1-standalone.jar
Test!
Run Code Online (Sandbox Code Playgroud)
一般来说,我建议lein new <name>通过命令行初始化一个项目并将其导入到所选的 Cursive/其他 IDE 中。