使用lein将cmd行参数传递给程序的问题

时间:2012-08-05 02:43:07

标签: clojure

我对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文件

...

2 个答案:

答案 0 :(得分:0)

我发布了一些在Linux上运行的项目的源代码。这些信息是我创建可以执行的程序所需要的。

以下代码用于读取.csv输入的程序,将该数据映射到html“form”参数;调用IIS服务器,要求通过accumail验证数据(街道地址);然后根据Web服务器的回答执行操作。

首先,project.clj:请注意:main

(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)

接下来,这是addr-verify / src / addr_verify / core.clj的标题。

请注意使用(: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编译到你心中。