ImageIO导入不起作用Clojure

时间:2015-06-18 15:42:55

标签: java clojure

我是一个Clojure新手,但我不明白我的代码有什么不对。

据我所知,代码应将img设置为新的BufferedImage对象。

(import javax.imageio.ImageIO)
(import java.io.File)
(def img (ImageIO/read (File. "C:\\input.png")))

然而,当我执行lein run时,我得到了这个例外:

Exception in thread "main" java.lang.RuntimeException: No such namespace: ImageIO, compiling:(fstego/core.clj:8:14)

1 个答案:

答案 0 :(得分:1)

不确定如何运行

lein run 

没有-main方法,所以这里有一些示例代码:

<强> project.clj

  (defproject testi "0.1.0-SNAPSHOT"
     :main fstego.core
     :dependencies [[org.clojure/clojure "1.6.0"]])

<强>的src / fstego / core.clj

  (ns fstego.core
    (:import [javax.imageio ImageIO])
    (:import [java.io File]))


  (defn -main[& args]
   (if-let [ path (first args) ]
    (let[ img (ImageIO/read (File. path))]
     (println 
      "Input Image has the following dimensions: " 
      (.getWidth img) "x" (.getHeight img)))
    (println "No image")))

然后

lein run <path_to_image>

应输出如下内容:

Input Image has the following dimensions:  251 x 60

修改 为什么在运行 lein run 时找不到java导入?

在运行命名空间的main方法之前,执行编译阶段并且没有特定的指令,您的命名空间会提前编译(称为aot)到Java。 要禁用该功能,您需要将其添加到project.clj

:main ^:skip-aot fstego.core

如果您清理目标文件夹并再次执行 lein run ,则只要您添加它们,就会找到导入。

如果您没有指定跳过此任务,或者您想直接从jar文件调用main方法,则生命周期会有所不同。

运行命名空间意味着代码的执行与在REPL中的执行一样,因此执行导入调用,并找到引用的类。

直接从编译的字节码运行main方法意味着对import的调用不包含在字节码中,因此被忽略,因此对ImageIO的调用无法正确找到类。