0

我对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 Client VM

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

问候索伦·斯文森


谢谢!

我做了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) 我(compile 'xmltvproc.core)从 REPL跑了

之前,我通过调用我的“main”函数来结束 core.clj (run-it *command-line-args*)。我对 -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 文件

??

4

2 回答 2

0

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

以下代码用于读取 .csv 输入的程序,将该数据映射到 html“表单”参数;调用 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.))]

  .
  .
  .
于 2012-08-05T17:53:18.087 回答
0

即使您使用提前编译,您也可以在任何地方使用 eval、load、read、load-file 和所有其余的动态编译代码。Clojure 不依赖于这些特性的 java 开发环境。所以你可以随意 AOT 编译到你心中的内容。

于 2012-08-05T17:59:46.773 回答