"帮助Arthur找到他的受限制的课程"或"我怎样才能使谷歌应用程序引擎快乐"

Art*_*ldt 6 java google-app-engine clojure compojure appengine-magic

在这里,我正在使用java.rmi.server.UID哪个令人不安的GAE.之后:只有我对骨头的依赖我才陷入僵局.

(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)
Run Code Online (Sandbox Code Playgroud)

我可以在jetty中加载它并且工作正常,将它加载到dev-appserver后我得到:

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:这是我的project.clj,这有助于:

(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"]])

ama*_*loy 6

FWIW我认为:only不会对GAE产生一些影响.它可能正在观察您加载的类,并且拒绝refer函数不会阻止其加载代码.

除了查看堆栈跟踪之外没有特定于域的经验,我认为可能导致问题的处理程序compojure.handler/site包括wrap-multipart-params.我怀疑你的应用程序需要这个功能,所以看看你是否可以使用compojure.handler/api.然后,如果site您确实需要特定的包装器,请手动将它们包装起来.

再说一次,鉴于我之前关于加载类的观点,我想代码multipart-params就是requirecompojure.handler命名空间后立即加载,所以你之后做的可能并不重要.我想你甚至可能只是做所有的包裹从apisite手动; 这不是很复杂.然后你应该能够避免require使用multipart-params命名空间.