我希望有两个主要类(或更多)与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
时,它会将其作为清单中的主类调用,但是如果不将某些东西放在< / em>的。但无论哪种方式,当我尝试运行'def'主要时,我得到一个未找到的类:
Exception in thread "main" java.lang.NoClassDefFoundError: def
答案 0 :(得分:13)
这至少适用于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"]})
然后你可以这样运行每个主要:
lein main-a
lein main-b
扩展到此:
lein with-profile main-a run
lein with-profile main-b run
我在我的一个项目中使用它,它完美无缺。
答案 1 :(得分:9)
我将:aot [abc def]
添加到project.clj以生成已编译的代码,并且它有效。
答案 2 :(得分:1)
在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!
在命令行中,多个主管中的“ - ”需要成为“_”,这使得它成为合法的Java类名。
$ java -cp target/uberjar/many-mains-0.1.0-SNAPSHOT-standalone.jar many_mains.abc
Hello, from many-mains.abc!
似乎Lein 2.7.0和之前的一些行为发生了变化:主要是在MANIFEST.MF上的nil。我在这里的作品就像Lein 2.7.0中的冠军一样。完整的来源是https://github.com/robertkuhar/many-mains