我是一个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)
答案 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的调用无法正确找到类。