Ответ 1
Я добавил :aot [abc def]
в project.clj, чтобы сгенерировать скомпилированный код, и он сработал.
Я хотел бы иметь два основных класса (или более) с 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
Я получаю, что когда я указал :main abc
в project.clj, он вызывал это как основной класс в манифесте, но я не мог заставить его работать, не помещая что-то. Но в любом случае, когда я пытаюсь запустить "def" main, я получаю класс не найден:
Exception in thread "main" java.lang.NoClassDefFoundError: def
Я добавил :aot [abc def]
в project.clj, чтобы сгенерировать скомпилированный код, и он сработал.
Это работает, по крайней мере, с 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
Я использую это в одном из своих проектов, и он отлично работает.
Что работало для меня как в задаче запуска leen 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 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 и ранее вокруг эффекта: main nil на MANIFEST.MF. То, что у меня здесь, работает как чемпион в Lein 2.7.0. Полный источник находится в https://github.com/robertkuhar/many-mains