我对clojure有些新意,但我是一位非常有经验的程序员。
我已经编写了一个clojure程序来处理和评估XMLTV列表(供个人使用)。该程序工作正常。它还会在运行时加载作为clojure语句编写的规则并执行它们。我已经读过,这意味着我不能“预编译”我的程序,我必须通过REPL运行它(比如"java -cp clojure-1.4.0.jar clojure-1.4.0.jar my-core.clj my-args"
)。如果这是错的,请纠正我。
问题是,当我在windows中运行它时,my-core.clj中的“main”函数获得命令行就好了,但是当我尝试在Ubuntu 12.04下运行它时,它或者抱怨没有找到clojure / main或我的功能。不是一个放弃,我尝试了"lein run my-args"
(该项目是用Leiningen构建的)但是我的程序在命令行中获得了nil。
我也尝试过-m namespace/func
同样的结果。
我正在使用Leiningen 1.7.1和Java 1.6.0_24 OpenJDK客户端虚拟机
任何人都有任何想法,我做错了什么?
此致 Soren Svensson
谢谢!
我做了3次更改,
1)我添加了(:gen-class)
2)我添加了一个:
(defn -main [cmd-line]
(println (type cmd-line))
(println cmd-line)
(println (type command-line-args))
(println command-line-args))
3)我从REPL
运行了(compile 'xmltvproc.core)
之前,我通过调用我的“main”函数(run-it *command-line-args*)
结束了core.clj。
我使用-main的测试显示cmd-line是命令行,但 command-line-args 是nil。
现在可以使用lein run arg1 arg2
运行它,但是当我尝试java -cp ...
时,它仍会失败。
java -cp ./lib/clojure.jar ./classes/xmltvproc/core arg1 arg2
Exception in thread "main" java.lang.NoClassDefFoundError: //classes/xmltvproc/core
java -cp ./lib/clojure.jar xmltvproc.core arg1 arg2
Exception in thread "main" java.lang.NoClassDefFoundError: clojure/lang/IFn
我已经尝试了所有可以想到的排列,结果总是上面两个中的一个。
这是我的project.clj文件:
(defproject xmltvproc "1.0.0-SNAPSHOT"
:description "Convert XMLTV listings to CSV file"
:main xmltvproc.core
:dependencies [[org.clojure/clojure "1.4.0"]])
我的xmltvproc / classes / xmltvproc包含所有预期的.class文件
...
答案 0 :(得分:0)
我发布了一些在Linux上运行的项目的源代码。这些信息是我创建可以执行的程序所需要的。
以下代码用于读取.csv输入的程序,将该数据映射到html“form”参数;调用IIS服务器,要求通过accumail验证数据(街道地址);然后根据Web服务器的回答执行操作。
(defproject addr-verify "1.0.0-SNAPSHOT"
:description "TODO: add summary of your project"
:dependencies [[org.clojure/clojure "1.2.1"]
[org.clojure/clojure-contrib "1.2.0"]
[clojure-csv/clojure-csv "1.2.4"]
[org.clojure/tools.cli "0.1.0"]
[clj-http "0.1.3"]]
:main addr-verify.core)
请注意使用(:gen-class)。
(ns addr-verify.core
^{:author "Charles M. Norton",
:doc "addr-verify is a small Clojure program that
runs address verification through the
.
.
.
"}
(:gen-class)
(:require [clojure.string :as cstr])
(:require [clojure.contrib.str-utils :as ustr])
(:require [clj-http.client :as client])
(:use clojure-csv.core)
(:use [clojure.tools.cli])
(:import java.util.Date)
(:import java.lang.Thread)
(:import java.io.File))
我最终跑了lein uberjar,然后我最终创造了一个可以从uberjar执行的独立行。
如果这对您没有帮助,请发布一些源代码和一个小程序。
不要让Clojure的版本让你停下来。我在家,并且有一段时间没有用新的来源更新我的笔记本电脑。
以下是我用来解析命令行的内容:
; Parses for options passed in on the command line.
(defn parse-opts
"Using the newer cli library, parses command line args."
[args]
(cli args
(optional ["--in-file-name" ".csv input file"
:default "resultset.csv"] identity)
(optional ["--out-file-name" ".csv pipe delimited output file"
:default "accumail_out.unl"] )))
; Main driver of the whole program.
(defn -main
[& args]
(let [opts (parse-opts args)
start-time (str (Date.))]
.
.
.
答案 1 :(得分:0)
即使您使用提前编译,也可以在任何地方使用eval,load,read,load-file和所有其他动态编译代码。 Clojure不依赖于为这些功能提供Java开发环境。所以你可以随意AOT编译到你心中。