拥有 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
我使用工件
实现了一个 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