跳轉到內容

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”方法,小程式可能會失敗。請參見 此討論

更多小程式示例

[編輯 | 編輯原始碼]
華夏公益教科書