Navigation Menu

Skip to content

Commit

Permalink
Look for main functions on Java classes in run task. Fixes #249.
Browse files Browse the repository at this point in the history
  • Loading branch information
technomancy committed Nov 10, 2011
1 parent dee34fa commit d3797fe
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 16 deletions.
2 changes: 2 additions & 0 deletions NEWS
Expand Up @@ -2,6 +2,8 @@ Leiningen NEWS -- history of user-visible changes

= 1.6.2 / ???

* Let run task work with main functions from Java classes.

* Fix bug where exceptions would break interactive task.

* Default to Clojure 1.3.0 for new projects.
Expand Down
31 changes: 19 additions & 12 deletions src/leiningen/run.clj
@@ -1,23 +1,30 @@
(ns leiningen.run
"Run a -main function with optional command-line arguments."
(:use [leiningen.compile :only [eval-in-project]]
[leiningen.core :only [abort]]))
[leiningen.core :only [abort]])
(:import (java.io FileNotFoundException)
(clojure.lang Reflector)))

(defn- get-ns-and-fn [given]
(if (= 'clojure.main given) ; special-case this oddity
['clojure.main 'main]
(let [[given-ns given-sym] ((juxt namespace name) given)]
(map symbol (if given-ns
[given-ns given-sym]
[given-sym "-main"])))))
(defn- normalize-main [given]
(if (namespace (symbol given))
(symbol given)
(symbol (name given) "-main")))

(defn- run-form [given args]
`(let [v# (resolve '~(normalize-main given))]
(if (ifn? v#)
(v# ~@args)
(Reflector/invokeStaticMethod
~(name given) "main" (into-array [(into-array String '~args)])))))

(defn- run-main
"Loads the project namespaces as well as all its dependencies and then calls
ns/f, passing it the args."
([project given-main & args]
(let [[main-ns main-fn] (get-ns-and-fn (symbol given-main))]
(eval-in-project project `((ns-resolve '~main-ns '~main-fn) ~@args)
nil nil `(require '~main-ns)))))
[project given & args]
(eval-in-project project (run-form given args)
nil nil `(try (require '~(symbol (namespace
(normalize-main given))))
(catch FileNotFoundException _#))))

(defn ^{:help-arglists '([])} run
"Run the project's -main function.
Expand Down
7 changes: 6 additions & 1 deletion test/leiningen/test/run.clj
Expand Up @@ -2,9 +2,10 @@
(:use [clojure.test]
[clojure.java.io :only [delete-file]]
[leiningen.core :only [read-project]]
[leiningen.javac :only [javac]]
[leiningen.run]
[leiningen.util.file :only [tmp-dir]]
[leiningen.test.helper :only [tricky-name-project]]))
[leiningen.test.helper :only [tricky-name-project dev-deps-project]]))

(def out-file (format "%s/lein-test" tmp-dir))

Expand Down Expand Up @@ -33,3 +34,7 @@
(is (= "nom::bbb" (slurp out-file)))
(is (zero? (run tricky-name-project "--" "-m")))
(is (= "nom:-m" (slurp out-file))))

(deftest test-run-java-main
(javac dev-deps-project)
(is (zero? (run dev-deps-project))))
2 changes: 1 addition & 1 deletion test_projects/dev-deps-only/project.clj
@@ -1,4 +1,4 @@
(defproject dev-deps-only "1.0.0-SNAPSHOT"
:java-source-path [["src"] ["src2"]]
:dev-dependencies [[org.clojure/clojure "1.2.0"]]
:main dev-deps-only.Junk)
:main dev_deps_only.Junk)
6 changes: 5 additions & 1 deletion test_projects/dev-deps-only/src/dev_deps_only/Junk.java
@@ -1,3 +1,7 @@
package dev_deps_only;

class Junk {}
public class Junk {
public static void main(String[] args) {
;
}
}
2 changes: 1 addition & 1 deletion todo.org
Expand Up @@ -14,8 +14,8 @@ See also https://github.com/technomancy/leiningen/issues
- [X] don't let multiple versions of a plugin interfere with each other (#301)
- [X] non-jar deps on classpath (#244)
- [X] recover from error in interactive (#234)
- [X] use java class in run task (#249)
- [ ] fix deploy with new maven-ant-tasks
- [ ] use java class in run task (#249)
- [ ] signed deps for plugins (#247)
- [ ] jvm-specific deps (JSR 310)
* For 1.6.1
Expand Down

0 comments on commit d3797fe

Please sign in to comment.