无法使用 Leiningen 构建 jar

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 编译失败:子进程失败

结构是:

  • 水定时器
    • 源文件
      • 音调producer.clj
    • 项目.clj
    • 目标

任何指导在这里将不胜感激。

bir*_*der 4

一番摆弄之后

  • 我放弃了(:require [general-helpers :as g]),因为没有必要演示这个问题
  • 错误:无法找到或加载主类 clojure.main 编译失败
    • 您没有包含 clojure 依赖项 [1]
  • :gen-class需要 AOT - 正如 Sanchayan 指出的
    • 参见[2]

项目.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 中。