Java &引用;帮助亚瑟找到他的受限职业”;或;我怎样才能让谷歌应用程序引擎快乐;

Java &引用;帮助亚瑟找到他的受限职业”;或;我怎样才能让谷歌应用程序引擎快乐;,java,google-app-engine,clojure,compojure,appengine-magic,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 (defrout

在这里的某个地方,我正在使用
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)
我可以把它装在码头上,它很好用, 将其加载到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) HTTP错误500 访问/乘法/1%202%204%208时出现问题。原因: java.rmi.server.UID是一个受限类。有关更多详细信息,请参阅谷歌应用程序引擎开发者指南。 原因: java.lang.NoClassDefFoundError:java.rmi.server.UID是受限类。有关更多详细信息,请参阅谷歌应用程序引擎开发者指南。 位于com.google.appengine.tools.development.agent.runtime.runtime.reject(runtime.java:51) 位于org.apache.commons.fileupload.disk.DiskFileItem.(DiskFileItem.java:103) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:186) 在ring.middleware.multipart_params$loading__4414__自动__.invoke(multipart_params.clj:1) at ring.middleware.multipart_params__init.load(未知源) at ring.middleware.multipart_params___init.(未知源) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:264) 位于clojure.lang.RT.loadClassForName(RT.java:1578) 在clojure.lang.RT.load处(RT.java:399) 在clojure.lang.RT.load处(RT.java:381) 在clojure.core$load$fn__4519.invoke处(core.clj:4915) ps:这是我的项目。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"]]) (defproject helloworld“1.0.0-SNAPSHOT” :description“修复:写入描述” :依赖项[[org.clojure/clojure“1.2.1”] [org.clojure/clojure-contrib“1.2.0”] [compojure“0.6.2”] [hiccup“0.3.4”] :开发依赖项[[appengine magic“0.4.1”] [swank clojure“1.2.1”]]
FWIW我不认为
:只有
会对GAE产生一点影响。它可能在观察您加载的类,拒绝
引用函数并不会阻止其代码被加载

除了查看stacktrace之外,没有特定领域的经验,我认为导致问题的处理程序可能是
compojure.handler/site
,其中包括
wrap multipart params
。我怀疑您的应用程序是否需要该功能,所以请看看您是否可以使用
compojure.handler/api
。然后,如果您确实需要来自的特定包装器,请手动包装它们

再一次,考虑到我前面关于加载类的观点,我想只要
需要
compojure.handler
名称空间,
multipart params
的代码就会被加载,所以在这之后做什么可能无关紧要。我想你甚至可能需要手动完成
api
site
的所有包装工作;这不是很复杂。然后您应该能够避免
要求
调用多部分参数命名空间。

(def-app(->(handler/site hello-routes)(wrap-base-url)))变成了:(def-app(->hello-routes(wrap-base-url)))