跳转到内容

Clojure 编程/示例/创建小程序

来自 Wikibooks,开放书籍,开放世界

本教程介绍如何创建一个简单的“Hello World!”小程序。本文还解释了如何对小程序进行签名(如果需要反射)。

演示页面位于 [1]

创建一个新目录,我们将其命名为“~/cljapp”。将“clojure.jar”文件复制到此目录中(本文档使用版本 1.0.0 进行测试)。

Clojure 代码

[编辑 | 编辑源代码]

创建一个 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 函数参数的类型提示,这些提示用于避免反射。反射对于小程序来说是一件不好的事情,因为它必须进行签名,即使这样也会向用户显示警告消息。但是,由于我们不希望用户遇到令人望而生畏的警告消息,因此我们应该避免反射,这可以通过添加类型提示来实现。

创建 JAR 文件

[编辑 | 编辑源代码]

现在我们编译 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

签名 JAR 文件

[编辑 | 编辑源代码]

(在许多情况下,您可以而且应该跳过本节)。

之前提到过,我们应该避免在小程序中使用反射。但是,这并非在所有情况下都可行。然后我们必须对小程序进行签名。

首先,创建密钥和证书,如网络上许多教程中所述。以下是一个简要总结。

使用 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 页面

[编辑 | 编辑源代码]

我们需要一个容纳小程序的容器,以下是一个简单的 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”方法,小程序可能会失败。请参见 此讨论

更多小程序示例

[编辑 | 编辑源代码]
华夏公益教科书