【问题标题】:Problems passing cmd line arguments to program using lein使用 lein 将命令行参数传递给程序的问题
【发布时间】:2012-08-05 02:43:07
【问题描述】:

我对 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 构建的),但我的程序在 command-line 中得到了 nil。

我也尝试过-m namespace/func,结果相同。

我正在使用 Leiningen 1.7.1 和 Java 1.6.0_24 OpenJDK 客户端虚拟机

有人知道我做错了什么吗?

问候 索伦·斯文森


谢谢!

我做了 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)

之前,我通过调用我的“主”函数(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 文件

??

【问题讨论】:

  • java -cp clojure.jar clojure.main /path/to/myscript.clj arg1 arg2 arg3
  • 如果您包含您的 project.clj 内容和无法看到 args 的行,我们可以给出更具体的答案

标签: clojure


【解决方案1】:

即使您使用提前编译,您也可以在任何地方使用 eval、load、read、load-file 和所有其他动态编译代码。 Clojure 不依赖于这些特性的 java 开发环境。这样您就可以随意进行 AOT 编译,满足您的需求。

【讨论】:

  • 感谢您的输入,我会尝试的。你知道为什么clojure.org/compilation 说:“使用 AOT 编译的一些原因是:...创建一个不需要运行时字节码生成和自定义类加载器的应用程序”?
【解决方案2】:

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

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

首先,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.))]

  .
  .
  .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2020-01-01
    • 2010-10-04
    • 2018-06-22
    • 2017-11-19
    相关资源
    最近更新 更多