根据the official Grails docs,Grails 2.4.2适用于JDK 1.6。就我而言,这意味着我可以在运行JDK 1.6的执行环境中运行所有与Grails 2.4.2一起使用的插件。
但是,当我尝试将Grails应用程序的war文件部署到运行在JDK 1.6上的Glassfish v3.1时,我遇到了与JDK 1.6兼容的依赖项问题:
Caused by: java.lang.UnsupportedClassVersionError: WEB9032: Class com.nimbusds.jwt.JWT has unsupported major or minor version numbers, which are greater than those found in the Java Runtime Env
ironment version 1.6.0_07
at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:948)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1485)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1368)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
... 55 more
运行dependency-report
后,我发现问题是由Spring Security REST插件的依赖引起的:
+--- org.grails.plugins:spring-security-rest:1.5.1
| \--- net.spy:spymemcached:2.11.6
| \--- com.google.guava:guava-io:r03
| \--- com.google.guava:guava-annotations:r03
| \--- com.google.guava:guava-base:r03
| \--- org.pac4j:pac4j-core:1.6.0
| \--- org.pac4j:pac4j-oauth:1.6.0
| \--- org.apache.commons:commons-lang3:3.1
| \--- org.scribe:scribe:1.3.6
| \--- com.fasterxml.jackson.core:jackson-databind:2.0.6
| \--- com.fasterxml.jackson.core:jackson-annotations:2.0.6
| \--- com.fasterxml.jackson.core:jackson-core:2.0.6
| \--- com.nimbusds:nimbus-jose-jwt:3.9
| \--- net.jcip:jcip-annotations:1.0
| \--- net.minidev:json-smart:1.1.1
| \--- org.bouncycastle:bcprov-jdk15on:1.51
| \--- commons-io:commons-io:2.4
导致问题的类com.nimbusds.jwt.JWT
是Spring Security REST插件所依赖的工件nimbus-jose-jwt
的一部分。
我觉得这个插件应该符合JDK 1.6标准,因为在插件页面上显示 Grails版本:2.0> * 即可。这是非常误导的,因为我花了很长时间开发,现在我意识到我甚至无法将其部署到生产中。不应该说 Grails版本:3.0> * ,或者我在这里误解了什么?
答案 0 :(得分:2)
我怀疑Nimbus JOSE+JWT(由Spring Security Core插件使用)需要Java 7+的原因是因为较小版本的Java不支持相同的加密。浏览他们的网站,您将看到最低要求:
Nimbus JOSE + JWT库需要Java 7+并且很少 的依赖关系。
你的假设只是因为插件支持Grails 2.0+意味着它也支持JDK 1.6只是一个假设,而且显然不正确。不要求Grails插件针对特定的Java兼容级别。
您的开发是在不使用生产环境中使用的Java最低目标版本的情况下完成的,这是真正的罪魁祸首。您应该始终使用目标生产环境的最低要求进行开发和测试。