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