【问题标题】:leiningen with multiple main classesleiningen 有多个主要课程
【发布时间】:2012-06-13 21:44:44
【问题描述】:

我希望有两个主要的类(或更多)与 leiningen,然后能够在 java 命令行中选择哪一个。例如我有:

(ns abc (:gen-class))
(defn -main [] (println "abc"))

(ns def (:gen-class))
(defn -main [] (println "def"))

使用 project.clj 具有:

(defproject my-jar "0.0.1"
 :description "test"
 :dependencies [
 ]
 :main abc)

然后我用lein uberjar 构建,然后运行:

java -cp my-jar-0.0.1-standalone.jar abc
java -cp my-jar-0.0.1-standalone.jar def

我知道,当我在 project.clj 中指定 :main abc 时,它会将其作为清单中的主类调用,但如果不添加 一些东西,我无法让它运行>。但无论哪种方式,当我尝试运行“def”主程序时,我都找不到一个类:

Exception in thread "main" java.lang.NoClassDefFoundError: def

【问题讨论】:

  • 为什么不使用 clojure cli github.com/clojure/tools.cli 并传递一个命令行参数来调用每个不同的选项?
  • 最终,拥有多个主电源(快速开发/测试)只是暂时的情况。但我不知道 tools.cli 所以感谢链接。我相信我将来会使用它。

标签: clojure leiningen


【解决方案1】:

这至少适用于 leiningen 2.0+

(defproject my-jar "0.0.1"
 :description "test"
 :dependencies [
 ]
 :profiles {:main-a {:main abc}
           {:main-b {:main def}}
 :aliases {"main-a" ["with-profile" "main-a" "run"]
           "main-b" ["with-profile" "main-b" "run"]})

然后你可以像这样运行每个 main:

lein main-a
lein main-b

扩展为:

lein with-profile main-a run
lein with-profile main-b run

我在我的一个项目中使用它,它运行良好。

【讨论】:

  • 感谢您的出色回答。一个小建议:IMO,别名中带有“run”更清晰;例如lein run-main-a。 (我这么说是因为lein run是默认提供的。)
【解决方案2】:

我在 project.clj 中添加了:aot [abc def] 以生成编译后的代码,它可以工作。

【讨论】:

  • 你在哪里添加的?
【解决方案3】:

在 lein 2.7.0 的运行任务以及生成的 uberjar 中对我有用的内容如下...

project.clj:

(defproject many-mains "0.1.0-SNAPSHOT"
  :description "Project containing multiple main methods"
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :main nil
  :target-path "target/%s"
  :profiles {:main-abc {:main many-mains.abc}
             :main-def {:main many-mains.def}
             :main-ghi {:main org.rekdev.mm.ghi}
             :core {:main many-mains.core}
             :uberjar {:aot :all}})

对于像...这样的来源

$ cat src/many_mains/abc.clj
(ns many-mains.abc
  (:gen-class))

(defn -main
  ""
  [& args]
  (println "Hello, from many-mains.abc!"))

这让 lein 像...一样运行工作

$ lein with-profile main-abc run
Hello, from many-mains.abc!

从命令行中,many-mains 中的“-”需要变成一个“_”,这使其成为合法的 Java 类名。

$ java -cp target/uberjar/many-mains-0.1.0-SNAPSHOT-standalone.jar many_mains.abc
Hello, from many-mains.abc!

围绕 :main nil 对 MANIFEST.MF 的影响,Lein 2.7.0 和之前的版本之间似乎发生了一些行为变化。我在这里得到的东西就像 Lein 2.7.0 中的冠军。完整来源在https://github.com/robertkuhar/many-mains

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2020-05-31
    • 2014-02-23
    • 2014-08-13
    • 2010-09-07
    • 2016-02-12
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多