拥有 JAAS 的码头

Jetty with owne JAAS

我使用工件

实现了一个 JAAS LoginModule
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>${jetty.version}</version>

LoginModule 的实现扩展了 Jetty 文档中推荐的 class AbstractLoginModule。如果我使用 <scope>provided</scope> 来声明 jetty-util 的依赖项,那么我会得到异常

java.lang.NoClassDefFoundError: org/eclipse/jetty/util/security/Credential 原因 Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.util.security.Credential

但是如果我删除 <scope>-Tag 以将其作为 运行time 包含在类路径中,那么我会得到异常

javax.security.auth.login.LoginException: java.lang.LinkageError: loader constraint violation: loader (instance of org/codehaus/plexus/classworlds/realm/ClassRealm) previously initiated loading for a different type with name "org/eclipse/jetty/util/security/Credential"

如果我使用默认的 JAAS 实现 PropertyFileLoginModule,一切都是开箱即用的。当然我不必声明这个神器的依赖。它包含在 jetty maven 插件中。

当我运行 Maven 中的jetty:run-插件时,所有的异常都会发生。

我的 JAAS 实现被分离在一个工件中,我的 Web 项目被分离在另一个工件中,基于 github 中码头提供的工件 test-jaas-webapp

如何将我自己的 JASS 实现与 Jetty Maven 插件结合使用?

环境:Jetty 9.2.x、Java 1.8_u111、Maven 3

好吧,经过一些尝试和错误,我发现以 maven 项目的方式处理类加载器。 第一个 JAAS 工件:

  • JAAS 实现必须在单独的工件中。
  • 此工件可以使用 jetty-util 作为依赖项,但仅限于提供的范围内。
  • 此工件必须作为码头服务器的模块加载。一种方法是,将工件的 jar 放入 lib/ext 并通过启动码头使用选项 --module=ext(更多关于类路径:https://www.eclipse.org/jetty/documentation/9.4.x/startup-classpath.html

现在 webapp 可以使用 JAAS 的这个实现。 Web 应用程序不得在其依赖项(POM 文件)中声明 JAAS 的实现。即使它可以像 Jetty Doc 中那样通过配置使用自定义的 JAAS 实现: https://www.eclipse.org/jetty/documentation/9.4.x/jaas-support.html