2017-09-07 94 views
1

發現我有科特林代碼:類DEF不是從科特林代碼

  cluster.removeIf { t: SolutionElement -> t.timeStart < minimumDate } //Clusters.kt:66 

如果羣集對象是易變的科特林名單。當我嘗試運行在谷歌App Engine的標準環境中,該代碼,我得到了一個錯誤:

java.lang.NoClassDefFoundError: java/util/function/Predicate 
    at com.google.appengine.runtime.Request.process-4a2a3dcd2b375db7(Request.java) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:820) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:375) 
    at net.toolla.teamly.services.matcher.Clusters.removeExpired(Clusters.kt:66) 
    at net.toolla.teamly.services.matcher.Clusters.pickMore(Clusters.kt:31) 
    at net.toolla.teamly.services.matcher.BestMatchWorker.getSolutionElements(BestMatchWorker.java:232) 
    at net.toolla.teamly.services.matcher.BestMatchWorker.match(BestMatchWorker.java:116) 
    at net.toolla.teamly.services.matcher.MatcherService.doPost(MatcherService.java:37) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) 
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:297) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:320) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:312) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassNotFoundException: java.util.function.Predicate 
    at com.google.appengine.runtime.Request.process-4a2a3dcd2b375db7(Request.java) 

在的build.gradle這個模塊,我有:

compileKotlin{ 
    kotlinOptions{ 
     jvmTarget = 1.6 
    } 
} 

沒有這個參數錯誤是:

Uncaught exception from servlet 
java.lang.NoClassDefFoundError: net/toolla/teamly/services/matcher/Clusters$removeExpired$1 

其中「removeExpired」是包含上述行的函數的名稱。

我將上面的代碼更改爲一些不太方便和舊的語法,但知道如何使用一些更新的技術會很好。

+0

嘗試在gradle中設置''sourceCompatibility = 1.6''。在Java <1.8中不應該使用'Predicate'。或者你想編譯爲JRE8? – s1m0nw1

+0

是的,這是真的 - 但代碼是在Kotlin中編譯的。 – piotrpo

回答

1

java.util.function.Predicate是用Java 8中引入的類,所以與8運行它關於日

... 
* @since 1.8 
*/ 
@FunctionalInterface 
public interface Predicate<T> { 

關於這個錯誤:

java.lang.NoClassDefFoundError: net/toolla/teamly/services/matcher/Clusters$removeExpired$1

確保你有你的classpath

該類
1

而不是removeIf,這是來自JDK 8的方法,因此在JDK 6上不受支持,因此可以使用所有JDK版本均支持Kotlin標準庫中的。