17

leiningenを使用して2つ(またはそれ以上)のメインクラスを作成し、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' mainを実行しようとすると、クラスが見つかりません。

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

3 に答える 3

16

これは、少なくともleiningen2.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つで使用しており、完全に機能します。

于 2013-09-24T17:31:28.470 に答える
9

:aot [abc def]コンパイルされたコードを生成するためにproject.cljに追加しましたが、機能しました。

于 2012-06-13T22:16:38.760 に答える
2

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!"))

これにより、leinrunは次のように機能します...

$ 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!

Lein 2.7.0とそれ以前の間で、MANIFEST.MFに対する:main nilの影響に関して、いくつかの動作の変更があったようです。私がここに持っているものは、Lein2.7.0のチャンピオンのように機能します。完全なソースはhttps://github.com/robertkuhar/many-mainsにあります

于 2016-08-29T17:01:34.643 に答える