«Помогите Артуру найти его ограниченный класс» или «Как я могу сделать движок приложения Google счастливым» - PullRequest
5 голосов
/ 31 мая 2011

где-то здесь я использую 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)

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

1 Ответ

5 голосов
/ 31 мая 2011

FWIW Я не думаю, что :only будет иметь значение для GAE. Вероятно, он следит за тем, какие классы вы загружаете, и отказ от refer функции не останавливает загрузку ее кода.

Не имея опыта работы с конкретным доменом, кроме просмотра трассировки стека, я думаю, что обработчик, вызывающий проблему, вероятно, compojure.handler/site, который включает wrap-multipart-params. Я сомневаюсь, что вам нужна эта функция для вашего приложения, так что посмотрите, сможете ли вы обойтись с compojure.handler/api. Затем, если вам нужны определенные обертки из site, оберните их вручную.

Опять же, учитывая мое предыдущее замечание о загрузке классов, я думаю, что код для multipart-params загружается, как только вы require пространство имен compojure.handler, так что то, что вы делаете после этого, может не иметь значения. Я полагаю, вам, возможно, даже придется сделать все переносы из api и site вручную; это не очень сложно. Тогда вы сможете избежать когда-либо require пространства имен multipart-params.

...