不能使用Leiningen建造一个罐子

时间:2016-07-12 12:54:46

标签: clojure executable-jar leiningen

我正试图使用​​Intellij的Cursive中的Leiningen插件从我的骨架Clojure项目中制作一个独立的jar。

为了创建项目,我刚创建了project.clj文件,打开它,Cursive提供将其作为项目导入。

project.clj:

(defproject WaterTimer "1"
  :description "A timer that reminds you to drink water"
  :main tone-producer/main)

音调producer.clj:

(ns tone-producer
  (:require [general-helpers :as g])

  (:import [javax.sound.midi MidiSystem
                             Synthesizer
                             MidiChannel])
  (:gen-class))

(defn main [& args]
  (println "Test!"))

当我运行“uberjar”任务时,我得到以下输出:

  

警告:指定:main,不包括在:aot。   隐含的AOT:主要将在Leiningen 3.0.0中删除。   如果您只需要AOT为您的uberjar,请考虑添加:aot:all into your   :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!"))

但现在我收到了错误:

  

错误:无法找到或加载主类clojure.main   编译失败:子进程失败

结构是:

  • WaterTimer
    • SRC
      • 音调producer.clj
    • project.clj

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

2 个答案:

答案 0 :(得分:4)

为了创建uberjars,项目文件应该具有:aot关键字,可以提前编译。

这是我的project.clj文件的输出。

(defproject jdbc "0.1.0-SNAPSHOT"
  :description "JDBC Project"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/java.jdbc "0.6.1"]
                 [postgresql "9.3-1102.jdbc41"]
                 [com.mchange/c3p0 "0.9.5.2"]
                 [byte-streams "0.2.2"]]
  :main jdbc.core
  :aot [jdbc.core])

注意:main和:aot条目。它也需要像birdspider所说的那样。

答案 1 :(得分:3)

经过一番摆弄

  • 我放弃(:require [general-helpers :as g]),因为没有必要说明问题
  • 错误:无法找到或加载主类clojure.main编译失败
    • 你没有包括clojure依赖[1]
  • :gen-class需要AOT - 正如Sanchayan指出的那样
    • 见[2]

project.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]

src / tone_producer.clj - USE'_'而不是文件名中的' - '

(ns tone-producer
  (:import [javax.sound.midi MidiSystem
                             Synthesizer
                             MidiChannel])
  (:gen-class))

(defn -main [& args]
  (println "Test!"))

结果:

$ 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!

通常我建议通过命令行使用lein new <name>初始化项目,并将其导入Cursive / Other IDE中。