Clojure 编程/示例/创建小程序
本教程介绍如何创建一个简单的“Hello World!”小程序。本文还解释了如何对小程序进行签名(如果需要反射)。
演示页面位于 [1]。
创建一个新目录,我们将其命名为“~/cljapp”。将“clojure.jar”文件复制到此目录中(本文档使用版本 1.0.0 进行测试)。
创建一个 javax.swing.JPanel 的子类并添加 paint 函数的实现。将文件保存到“~/cljapp/src/applet.clj”。
(ns applet
(:import (java.awt Graphics Color Font RenderingHints)
(javax.swing JApplet JButton))
(:gen-class
:extends javax.swing.JApplet))
(defn -paint [#^JApplet applet #^Graphics g] ;type hint avoids Reflection, then it works without signing
(let [width (.getWidth applet)
height (.getHeight applet)]
(doto g
(.setColor (. Color YELLOW))
(.fillRect 0 0 width height)
(.setColor (. Color BLACK))
(.drawRect 0 0 (dec width) (dec height))
(.setFont (Font. "Serif" (. Font PLAIN) 24))
(.drawString "Hello World!" 20 40))))
这将显示一个带有黑色边框的黄色矩形,其中包含黑色文本“Hello World!”。
请注意 -paint 函数参数的类型提示,这些提示用于避免反射。反射对于小程序来说是一件不好的事情,因为它必须进行签名,即使这样也会向用户显示警告消息。但是,由于我们不希望用户遇到令人望而生畏的警告消息,因此我们应该避免反射,这可以通过添加类型提示来实现。
现在我们编译 Clojure 代码到 Java 类,并将文件放到“~/cljapp/cljapp.jar”(注意 Windows 用户:使用“-cp ../clojure.jar;.” 而不是“-cp ../clojure.jar:.”,即分号而不是冒号作为路径分隔符)。
cd src java -Dclojure.compile.path=. -cp ../clojure.jar:. clojure.lang.Compile applet jar cf ../cljapp.jar . cd ..
JAR 文件的内容应如下所示:
/META-INF /MANIFEST.MF applet$_paint__1.class applet.class applet.clj (you can omit the file if you do not want to distribute the source) applet__init.class
(在许多情况下,您可以而且应该跳过本节)。
之前提到过,我们应该避免在小程序中使用反射。但是,这并非在所有情况下都可行。然后我们必须对小程序进行签名。
首先,创建密钥和证书,如网络上许多教程中所述。以下是一个简要总结。
使用 keytool 创建一个新密钥(将 MyAlias 替换为任何名称,有关其他参数的更多详细信息,请参见 keytool 文档)。
keytool -genkey -alias MyAlias -dname "cn=MyCompanyName, c=en"
请记住您输入的密码,我们稍后会用到它。然后,创建证书。
keytool -selfcert -alias MyAlias -dname "cn=MyCompanyName, c=en"
现在我们可以对“clojure.jar”文件进行签名(我们不需要对我们自己的小程序进行签名)。
jarsigner clojure.jar MyAlias
我们需要一个容纳小程序的容器,以下是一个简单的 HTML 页面,我们将将其保存为“~/cljapp/cljapp.html”。
<html>
<head>
<title>My first Clojure applet</title>
</head>
<body>
<applet archive="cljapp.jar, clojure.jar" code="applet.class" width="400" height="200"></applet>
</body>
</html>
现在您可以将“cljapp.html”、 “cljapp.jar” 和“clojure.jar”文件上传到您的 Web 服务器。
仅针对签名的小程序:当您打开“cljapp.html”时,您将被询问(像网站的每个访问者一样)是否信任小程序的作者。只有在用户同意后才能启动小程序。
与 Java 小程序相比,Clojure 小程序的一些缺点。
- clojure.jar 也需要下载,大约有 1.4 MB(您可以尝试使用“clojure-slim.jar”,它只有大约 0.5 MB,但似乎不适用于未签名的小程序)。
- 仅针对签名的小程序:小程序不受信任(除非您有来自证书颁发机构的经过验证的证书),用户必须同意运行它。
- 在每个文件的顶部使用“(set! *warn-on-reflection* true)”来查找(然后消除)反射调用。
- 避免使用“-main”方法!Clojure 中似乎存在一个(未解决的)错误,如果存在“-main”方法,小程序可能会失败。请参见 此讨论。
- 音调听力训练:一个使用 JavaSound 的 Clojure 小程序,带有源代码。