Clojure: Как запустить мой основной из банки? - PullRequest
13 голосов
/ 04 декабря 2010

У меня есть приложение Clojure, упакованное в банку. Я запускаю его как:

java -cp lib/clojure-1.2.0.jar:my-app.jar clojure.main -e "(use 'foo.main)(-main)"

Это единственный способ запустить мое приложение из этой банки? В частности, я бы хотел увидеть что-то простое:

java -cp lib/clojure-1.2.0.jar:my-app.jar clojure.main foo.main

Ответы [ 3 ]

13 голосов
/ 05 декабря 2010

Использование

(ns foo.main
  (:gen-class)

в вашем основном источнике для создания файла класса квалифицированного пакета пространства имен. Добавить

:main foo.main
:manifest {"Class-Path" "lib/clojure-1.2.0.jar"}

в ваш файл проекта Leiningen. После «lein jar» вы можете запустить приложение, используя метаданные из файла манифеста, встроенного в JAR:

java -jar foo-YOURVERSION.jar
4 голосов
/ 04 декабря 2010

Если вы заполняете ваше приложение заданием leiningens uberjar, все, что вам нужно сделать, это запустить,

java -jar name-of-your-app.jar
2 голосов
/ 20 августа 2018

Теперь это возможно [1], если вы можете сгенерировать правильный путь к классу (например, из Leiningen):

java -cp $ (lein classpath) clojure.main -e "(do '(require '[clojure.string]) (println (clojure.string / join \ "\" [1 2 3]))) "

или из уберджара:

java -cp my_uberjar.jar clojure.main -e "(do '(require' [clojure.string]) (println (clojure.string / join \" \ "[1 2 3])))"

Вы также можете сделать нечто похожее из другого процесса Clojure (например, repl), используя эту библиотеку https://github.com/clojure/java.classpath

(clojure.java.shell/sh "java" "-cp" (clojure.string/join ":" (map #(.toString %) (clojure.java.classpath/classpath) "clojure.main" :in (pr-str '(do (require '[my.namespace]) ([my.namespace/my-main)))))

[1] Не уверен, когда это было введено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...