'lein jar' и 'lein uberjar' неправильно настраивают основной класс - PullRequest
4 голосов
/ 09 сентября 2010

Я запустил lein uberjar в своем проекте, и он создал соответствующие файлы JAR. Когда я запускаю банку, выбрасывается ClassNotFoundException: explodingdots.core. Я указал explodingdot.core в качестве основного класса. Я извлек jar-файл, и в соответствующем каталоге действительно не было core.class. Что я забыл?

У меня есть следующий код в src/explodingdots/core.clj

(ns explodingdots.core  
 (:import (java.awt Color Dimension Graphics2D AlphaComposite RenderingHints)
          (java.awt.event ActionListener MouseAdapter WindowAdapter)
          (javax.swing Timer JPanel JFrame))
  (:gen-class))

[ ... ]

(defn -init[] exploding-dots)
(defn -main[_]
  (let [ed (new explodingdots.core)]
    (.init ed)))

Содержание моего project.clj:

(defproject explodingdots "0.1"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]]
  :main explodingdots.core)

Примечание: Я использую leiningen 1.3.1

Ответы [ 2 ]

5 голосов
/ 10 сентября 2010

Хорошо, я решил свою первоначальную проблему. Признаться в этом немного стыдно, но я думаю, что должен сделать это ради полноты этой темы. Я перепутал свои пути. У меня есть один и тот же файл в проекте Netbeans и в проекте leiningen. И я редактировал файл Netbeans. К сожалению.

Но тогда у меня была другая проблема. Основной метод найден, но я получаю

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: core$-main

Я попытался изменить основной метод с (defn -main [_] ...) до (defn -main [& args] ...), как предположил Артур, но это не сработало. Чтобы решить эту проблему, я написал (defn -main[]...) без аргументов.

Следующая проблема заключалась в том, что вызов (init) из (main) привел к ошибке. Я решил эту проблему, вообще не вызывая (init), а напрямую (exploding-dots) из (main).

Так что, чтобы все работало, мой src/explodingdots/core.clj выглядит как

(ns explodingdots.core  
 (:import (java.awt Color Dimension Graphics2D AlphaComposite RenderingHints)
          (java.awt.event ActionListener MouseAdapter WindowAdapter)
          (javax.swing Timer JPanel JFrame))
  (:gen-class))

[ ... ]

(defn -main[] (exploding-dots))

Глядя на решение, я должен подумать, почему я не написал это прямо сейчас. Это самый простой и прямой путь. Может быть, мне нужен отпуск;).

2 голосов
/ 09 сентября 2010

Мне пришлось добавить третий компонент в основное пространство имен и переместить все в подкаталог com под src.

com.explodingdots.core

Я также объявляю, что main принимает вектор arg, но не уверен, что это имеет значение:

(declare main) 
(defn -main [& args]    
...