2011-05-31 5 views
5

Burada bir yerde java.rmi.server.UID kullanıyorum. Sonrasında: sadece bağımlılıklarımın kemiğe yapışması, bir çıkmazdayım."Arthur'un kısıtlı sınıfını bulmasına yardımcı olun" veya "Google uygulama motorunu nasıl mutlu edebilirim"

(ns helloworld.core 
    (:use ;[hiccup.core] 
     [hiccup.page-helpers :only (html5 include-css)] 
     [clojure.contrib.string :only (split)] 
     [compojure.core :only (defroutes GET)] 
     [hiccup.middleware :only (wrap-base-url)]) 
    (:require [appengine-magic.core :as ae] 
      [compojure.route :as route 
       :only (resources not-found) ] 
      [compojure.handler :as handler :only (site)]) 
    (:gen-class :extends javax.servlet.http.HttpServlet)) 

(defn index-page 
    ([name] 
    (html5 
     [:head 
     [:title (str "Hello " name)] 
     (include-css "/css/style.css")] 
     [:body 
     [:h1 (str "Hello " name)]])) 
    ([] (index-page "World"))) 

(def match-opperator 
    { "add"  + 
    "subtract" - 
    "multiply" * 
    "divide" /}) 

(defroutes hello-routes 
    (GET "/:f/*" [f & x] 
     (index-page (apply (match-opperator f) 
          (map #(Integer/parseInt %) 
           (split #" " (:* x)))))) 
    (GET "/" [] (index-page)) 
    (route/resources "/") 
    (route/not-found "Page not found")) 

(def app 
    (-> (handler/site hello-routes) 
     (wrap-base-url))) 

(ae/def-appengine-app helloworld-app #'app) 

ben iskelesi onu yükleyebilirsiniz ve ben bu olsun dev-appserver yerleştirmeden sonra, çalışıyor:

 
HTTP ERROR 500 

Problem accessing /multiply/1%202%204%208. Reason: 

    java.rmi.server.UID is a restricted class. Please see the Google App Engine developer's guide for more details. 

Caused by: 

java.lang.NoClassDefFoundError: java.rmi.server.UID is a restricted class. Please see the Google App Engine developer's guide for more details. 
    at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51) 
    at org.apache.commons.fileupload.disk.DiskFileItem.(DiskFileItem.java:103) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:186) 
    at ring.middleware.multipart_params$loading__4414__auto__.invoke(multipart_params.clj:1) 
    at ring.middleware.multipart_params__init.load(Unknown Source) 
    at ring.middleware.multipart_params__init.(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at clojure.lang.RT.loadClassForName(RT.java:1578) 
    at clojure.lang.RT.load(RT.java:399) 
    at clojure.lang.RT.load(RT.java:381) 
    at clojure.core$load$fn__4519.invoke(core.clj:4915) 

ps: bu yardımcı olur burada project.clj edilir örtmek :

 
(defproject helloworld "1.0.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :dependencies [[org.clojure/clojure "1.2.1"] 
       [org.clojure/clojure-contrib "1.2.0"] 
       [compojure "0.6.2"] 
       [hiccup "0.3.4"]] 

    :dev-dependencies [[appengine-magic "0.4.1"] 
        [swank-clojure "1.2.1"]]) 

cevap

5

FWIW :only GAE için fark biraz yapacak sanmıyorum. Muhtemelen hangi sınıfları yüklediğinizi izler ve bir işlevin refer kodunu reddetmesi kodunun yüklenmesini durdurmaz.

Stacktrace'e bakmak dışında etki alanına özgü bir deneyim olmadan, bu soruna neden olan işleyicinin, wrap-multipart-params numaralı compojure.handler/site olduğunu düşünüyorum. Uygulamanız için bu özelliğe ihtiyacınız olduğundan şüphe duyuyorum, bu yüzden compojure.handler/api ile ilgili bir şeyler yapıp yapamayacağınızı görün. Ardından, ihtiyacınız olan site'dan özel sarmalayıcılar varsa, bunları manuel olarak sarın.

Sonra tekrar yükleme sınıfları hakkında benim önceki noktaya göz önüne alındığında, ben multipart-params için kod bitmez yüklenecek oluyor sen require compojure.handler ad olarak, bu nedenle ne bunun bir önemi olmayabilir sonra sanırım. Sadece tüm ambalajları api ve site el ile yapmanız bile gerekebilir; çok karmaşık değil. Öyleyse, çok yollu params ad alanı için hiç require'dan kaçınmanız gerekir.

+1

bırakarak tüm referanslar çalışmış compojure.handler için :) –

+0

(def (app -> (işleyici/sitesi merhaba-rotalar) (wrap-baz-url))) olur sadece: (def app (- > merhaba-yolları (wrap-base-url))) –