2012-06-13 11 views
13

मुझे लीनिंगेन के साथ दो मुख्य वर्ग (या अधिक) होना चाहते हैं, और फिर जावा कमांड लाइन में कौन सा चयन करने में सक्षम होना चाहिए। उदाहरण के लिए मेरे पास है:एकाधिक मुख्य कक्षाओं के साथ leiningen

(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 कि प्रोजेक्ट.क्लज में यह इसे मैनिफेस्ट में मुख्य श्रेणी के रूप में बुला रहा था, लेकिन मुझे डालने के बिना इसे चलाने के लिए नहीं मिला। लेकिन किसी भी तरह से जब मैं 'डीईएफ़' मुख्य चलाने का प्रयास, मैं नहीं मिला एक वर्ग मिलती है:

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

क्यों क्लोजर क्ली https://github.com/clojure/tools.cli का उपयोग नहीं करते हैं और प्रत्येक अलग-अलग विकल्पों को कॉल करने के लिए cmd लाइन तर्क पास करते हैं? – locojay

+0

आखिरकार यह कई अस्थायी (तेजी से देव/परीक्षण) होने के लिए एक अस्थायी स्थिति थी। लेकिन मुझे उपकरण के बारे में पता नहीं था .cli तो लिंक के लिए धन्यवाद। मुझे यकीन है कि मैं इसे भविष्य में उपयोग करूंगा। – Kevin

उत्तर

9

मैं project.clj को :aot [abc def] जोड़ा संकलित कोड उत्पन्न करने के लिए और यह काम किया।

+1

आपने इसे कहां जोड़ा? – Jackson

12

यह कम से कम 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

महान उत्तर के लिए धन्यवाद। एक छोटा सा सुझाव: आईएमओ, उपनाम नाम में "चलाने" के लिए स्पष्ट है; जैसे 'लीन रन-मेन-ए '। (मैं यह इसलिए कहता हूं क्योंकि डिफ़ॉल्ट रूप से 'लीन रन' प्रदान किया जाता है।) –

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! 

कमांड लाइन से '-' कई-पुरुषों में '_' बनने की आवश्यकता है जो इसे एक कानूनी जावा क्लासनाम बनाता है। MANIFEST.MF पर मुख्य शून्य: के प्रभाव के आसपास पहले

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

वहाँ लें 2.7.0 और के बीच कुछ व्यवहार परिवर्तन हुए हैं लगता है। मुझे जो मिला है वह लीन 2.7.0 में एक चैंप की तरह काम करता है। पूर्ण स्रोत https://github.com/robertkuhar/many-mains

संबंधित मुद्दे