为什么 Spring 安全 REST 插件与 JDK 1.6 不兼容?
Why is the Spring Security REST Plugin not compatible with JDK 1.6?
根据 the official Grails docs,Grails 2.4.2 可与 JDK 1.6 一起使用。就我而言,这意味着我可以 运行 在 JDK 1.6 上 运行s 的执行环境中使用 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 安全 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
导致问题的 class com.nimbusds.jwt.JWT
是工件 nimbus-jose-jwt
的一部分,Spring 安全 REST 插件依赖于它。
我觉得这个插件应该 JDK 1.6 兼容,因为在插件的页面上它说 Grails 版本:2.0 > *。这是非常误导的,因为我花了很多时间进行开发,现在我意识到我什至无法将它部署到生产环境中。它不应该说 Grails 版本:3.0 > *,还是我误解了什么?
我怀疑 Nimbus JOSE+JWT(由 Spring 安全核心插件使用)需要 Java 7+ 的原因是 Java 的较低版本不支持相同的密码学。浏览他们的网站,您将看到最低要求:
The Nimbus JOSE + JWT library requires Java 7+ and has minimal
dependencies.
您假设插件支持 Grails 2.0+ 就意味着它也支持 JDK 1.6,这只是一个假设,而且显然是不正确的。不要求 Grails 插件针对特定的 Java 兼容级别。
您的开发是在未使用生产环境中使用的 Java 的最低目标版本的情况下完成的,这才是真正的罪魁祸首。您应该始终根据目标生产环境的最低要求进行开发和测试。
根据 the official Grails docs,Grails 2.4.2 可与 JDK 1.6 一起使用。就我而言,这意味着我可以 运行 在 JDK 1.6 上 运行s 的执行环境中使用 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 安全 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
导致问题的 class com.nimbusds.jwt.JWT
是工件 nimbus-jose-jwt
的一部分,Spring 安全 REST 插件依赖于它。
我觉得这个插件应该 JDK 1.6 兼容,因为在插件的页面上它说 Grails 版本:2.0 > *。这是非常误导的,因为我花了很多时间进行开发,现在我意识到我什至无法将它部署到生产环境中。它不应该说 Grails 版本:3.0 > *,还是我误解了什么?
我怀疑 Nimbus JOSE+JWT(由 Spring 安全核心插件使用)需要 Java 7+ 的原因是 Java 的较低版本不支持相同的密码学。浏览他们的网站,您将看到最低要求:
The Nimbus JOSE + JWT library requires Java 7+ and has minimal dependencies.
您假设插件支持 Grails 2.0+ 就意味着它也支持 JDK 1.6,这只是一个假设,而且显然是不正确的。不要求 Grails 插件针对特定的 Java 兼容级别。
您的开发是在未使用生产环境中使用的 Java 的最低目标版本的情况下完成的,这才是真正的罪魁祸首。您应该始终根据目标生产环境的最低要求进行开发和测试。