Confluence 8 で JDK 17 にアップグレードすると、「NoClassDefFoundError: Could not initialize class org.springframework.ldap.core.support.LdapContextSource」により「isShowSignUp」メソッドで「System Error」がトリガーされる
プラットフォームについて: Server および Data Center のみ。この記事は、Server および Data Center プラットフォームのアトラシアン製品にのみ適用されます。
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
要約
Confluence は起動すると、ライセンスを持つユーザー数を取得するためにユーザー ディレクトリにアクセスする必要があります。これが出来ないため、Confluence UI で「System Error」が表示されます。
この特定のユースケースでは、JDK 17 が Confluence 8 の一部の LDAP アクセス クラスへのアクセスを制限しているため、このプロセスが正常に完了できません。
環境
Confluence 8.0 以降で JDK 17 を使用している環境
診断
atlassian-confluence.log
に、起動時に次のようなエントリが表示される。
2023-07-05 12:17:36,484 ERROR [http-nio-8090-exec-2 url: /login.action] [apache.struts2.result.VelocityResult] doExecute Unable to render velocity template: '/login.vm'
-- url: /login.action | userName: anonymous | action: login | traceId: 06d3a2d227984e5b
org.apache.velocity.exception.MethodInvocationException: Invocation of method 'isShowSignUp' in class com.atlassian.confluence.user.actions.LoginAction threw exception java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.ldap.core.support.LdapContextSource at /login.vm[line 6, column 28]
at org.apache.velocity.runtime.parser.node.ASTMethod.handleInvocationException(ASTMethod.java:342)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:284)
...
...
Caused by: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.ldap.core.support.LdapContextSource
at java.base/java.util.concurrent.FutureTask.report(Unknown Source)
at java.base/java.util.concurrent.FutureTask.get(Unknown Source)
at com.atlassian.confluence.util.ReadOnlyLicenseCalculator.getNumberOfLicensedUsers(ReadOnlyLicenseCalculator.java:62)
...
...
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.ldap.core.support.LdapContextSource
at com.atlassian.crowd.directory.LdapContextSourceFactory.createContextSource(LdapContextSourceFactory.java:73)
at com.atlassian.crowd.directory.LdapContextSourceProvider.getPooledContextSource(LdapContextSourceProvider.java:28)
at com.atlassian.crowd.directory.SpringLDAPConnector.getContextSource(SpringLDAPConnector.java:208)
at com.atlassian.crowd.directory.SpringLDAPConnector.setAttributes(SpringLDAPConnector.java:184)
at com.atlassian.crowd.directory.loader.RemoteDirectoryInstanceFactoryUtil.newRemoteDirectory(RemoteDirectoryInstanceFactoryUtil.java:42)
...
...
原因
一部のツールおよびライブラリは、リフレクションを使用してJDKの内部でのみ使用される部分にアクセスします。このリフレクションの使用は、JDK のセキュリティと保守性に悪影響を及ぼします。移行を支援するために JDK 9 から JDK 16 ではこのリフレクションの継続が許可されていましたものの、不正なリフレクション アクセスに関する警告が発行されました。JDK 17 は強力にカプセル化されているため、このリフレクションはデフォルトでは許可されなくなりました。
そのため、一部の内部 API は、それらに依存する他のライブラリからアクセスできるように公開する必要があります。
追加情報は次のページにもあります。
- JEP 403: Strongly Encapsulate JDK Internals
- JEP 261: Module System
- CONFSERVER-83907 - Getting issue details... STATUS
ソリューション
ソリューション 1
これらの内部 API を公開するために必要な引数が含まれている、準備済みのファイル jpms-args.txt
を使用できます。
次のシステム プロパティを
setenv.sh
ファイルに追加してください# Add various JPMS arguments to allow Confluence to work on Java 17 CATALINA_OPTS="@$CATALINA_HOME/confluence/WEB-INF/jpms-args.txt ${CATALINA_OPTS}"
- Confluence を再起動します。
ソリューション 2
または、特定の JVM フラグを追加して、ldapContextSource クラスに関連する状況を解決してください。
次のシステム プロパティを
setenv.sh
ファイルに追加してくださいCATALINA_OPTS="--add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED ${CATALINA_OPTS}"
- Confluence を再起動します。