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 小程式,帶有原始碼。