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 は、それらに依存する他のライブラリからアクセスできるように公開する必要があります。

追加情報は次のページにもあります。

ソリューション

ソリューション 1

これらの内部 API を公開するために必要な引数が含まれている、準備済みのファイル jpms-args.txt を使用できます。 

  1. 次のシステム プロパティ 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}" 
  2. Confluence を再起動します。

ソリューション 2

または、特定の JVM フラグを追加して、ldapContextSource クラスに関連する状況を解決してください。

  1. 次のシステム プロパティ setenv.sh ファイルに追加してください

    CATALINA_OPTS="--add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED ${CATALINA_OPTS}"
  2. Confluence を再起動します。

最終更新日 2024 年 6 月 21 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.