【问题标题】:Why is the Spring Security REST Plugin not compatible with JDK 1.6?为什么 Spring Security REST 插件与 JDK 1.6 不兼容?
【发布时间】:2015-08-30 20:25:50
【问题描述】:

根据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 Plugin的依赖引起的:

+--- 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 是工件 nimbus-jose-jwt 的一部分,Spring Security REST 插件依赖于它。

我觉得这个插件应该是 JDK 1.6 兼容的,因为插件页面上写着 Grails version: 2.0 > *。这是非常具有误导性的,因为我花了很多时间进行开发,现在我意识到我什至无法将它部署到生产中。不应该是 Grails 版本:3.0 > *,还是我在这里误解了什么?

【问题讨论】:

  • 我是spring-security-rest 的作者。老实说,我不知道 Nimbus 的这种要求,这就是为什么没有做广告的原因。另一方面,使用 Java 6,当不仅它而且 Java 7 都已经不受支持时,我感觉很奇怪。无论如何,我会在文档中提到最低版本要求。
  • 感谢您抽出宝贵时间对此发表评论。老实说,我对这个快速回复感到非常惊讶,并且很高兴现在将记录下来,因为我喜欢你的插件并且讨厌我无法在生产中使用它的事实。它在 JDK 1.7 上就像一个魅力。遵循文档,除了过滤器链之外不需要配置任何东西。很棒的插件,除了未记录的 JDK 问题,没有任何批评的意思!

标签: rest grails dependency-management jwt


【解决方案1】:

我怀疑Nimbus JOSE+JWT(由 Spring Security Core 插件使用)需要 Java 7+ 的原因是因为 Java 的较小版本不支持相同的加密。浏览他们的网站,您会看到最低要求:

Nimbus JOSE + JWT 库需要 Java 7+ 并且具有最少的 依赖关系。

您认为插件支持 Grails 2.0+ 就意味着它也支持 JDK 1.6 的假设只是一个假设,而且显然是不正确的。不要求 Grails 插件针对特定的 Java 兼容级别。

您的开发没有使用生产环境中使用的 Java 的最低目标版本这一事实是真正的罪魁祸首。您应该始终按照目标生产环境的最低要求进行开发和测试。

【讨论】:

  • 感谢您的澄清。我不确定不提及被认为与 Grails 兼容的 JDK 版本的合规性问题是否是常规做法。这就是为什么我首先问我是否误解了。对我来说,这似乎仍然很奇怪。我在指定为与所选 Grails 版本兼容的执行环境上运行 Grails 应用程序。然后我安装了一个指定为与该版本兼容的插件。是否应该在某种警告中指出我可能会在某些执行环境中遇到问题?
  • 我知道我应该首先使用 JDK 1.6_07;但是,当时我正在使用另一个工作站。我并不是说这不是我的错,只是指出常见 JDK 的问题可以省去几个小时的工作。毕竟,如果我已经阅读了一段时间的插件,尝试安装了一段时间,然后在本地遇到了合规性问题,我仍然会在这个过程中浪费宝贵的时间。
  • 我同意,可以提供的有关最低要求的更多信息应该是,我知道如果您联系插件的作者,我相信他们会很乐意为将来提供此信息用户。很抱歉您浪费了宝贵的时间,但您在此过程中学到了一些东西。 1. Grails 的版本不以任何方式表明 JDK 要求和 2. 始终使用将在生产中使用的最低 JDK 进行开发。很高兴我能够消除您对 Grails 版本和 JDK 要求的困惑。
  • 确实如此。如果不必解决这样的问题,我就不会成为今天的我。不过,我很高兴当我在谷歌上搜索“spring security rest nimbus”时首先弹出这个问题。这可能会帮助像我这样的懒人在安装插件之前不会进一步检查所有依赖项:)
猜你喜欢
  • 2011-03-04
  • 2015-03-07
  • 1970-01-01
  • 2016-09-25
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多