我正试图使用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 编译失败:子进程失败
结构是:
这里的任何指导都将不胜感激。
答案 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])
,因为没有必要说明问题:gen-class
需要AOT - 正如Sanchayan指出的那样
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中。