【问题标题】:Can't build a jar using Leiningen无法使用 Leiningen 构建 jar
【发布时间】:2016-11-14 17:35:34
【问题描述】:

我正在尝试使用 Intellij's 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)

tone-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 中。 :main 的隐式 AOT 将在 Leiningen 3.0.0 中删除。 如果您的 uberjar 只需要 AOT,请考虑将 :aot :all 添加到您的 :uberjar 个人资料。 警告:指定的 Main-Class 在 jar 中不存在。它可能无法按预期执行。包含 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 编译失败:子进程失败

结构是:

  • 饮水机
      • tone-producer.clj
    • project.clj
    • 目标

如有任何指导,我们将不胜感激。

【问题讨论】:

  • 尝试重命名主 -main / 或在您的第二个方法中从 project.clj 中删除 :main - 编辑:等待通常没有 src/<ns>/core.clj - 您的项目布局看起来很奇怪
  • 如果我这样做 lein new watertimer 我会得到 gist.github.com/birdspider/dcb987f881199f0a6721af4d8fd41a10 - 也许你可以尝试以这种方式启动项目。
  • 进一步你的defproject缺少clojure :dependencies(即:dependencies [[org.clojure/clojure "1.8.0"]])因此你得到第二个Error
  • @birdspider core.clj 只是 lein 使用的一个随机名称,因为没有其他名称足够通用,人们保留它实际上有点烦人

标签: clojure executable-jar leiningen


【解决方案1】:

为了创建 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 条目。它还需要是 -main ,如birdspider 所述。

【讨论】:

    【解决方案2】:

    经过一番折腾

    • 我放弃了(: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]
    

    src/tone_producer.clj - 在文件名中使用“_”而不是“-”

    (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 &lt;name&gt; 初始化一个项目,然后将其导入选择的 Cursive/Other IDE。

    【讨论】:

    • 太棒了,谢谢,我会在几秒钟内测试它。我手动创建了它,因为路径上没有 leiningen,我今天早上才第一次触摸它,我什至不知道它在我的驱动器上的位置。我想我需要进行设置。
    • Leiningen 找不到前面提到的general-helpers,我的休息时间结束了,所以我得稍后测试一下。 general-helpers 位于与“WaterTimer”位于同一文件夹中的文件夹中。如何将该依赖项添加到project.clj
    • @Carcigenicate,我怀疑你的一般助手在文件系统中不是general_helpers.clj(注意_ vs. -),你的源文件的名称中不能有-
    • 它使用下划线。我在问题中使用破折号是一个错字。
    • @Carcigenicate,我认为如果您提供项目根目录的命令行突击队tree 的(可能修剪过的)输出,那将是一个好主意 - 这样我们就可以实际看到在哪里和您的文件和文件夹的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2017-07-25
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多