ARTIFACTORY: How to troubleshoot NoClassDefFound errors?
DescriptionOne may encounter an error such as the following in logs.
2021-07-19T09:22:10.832Z [jfac ] [ERROR] [4f658ce7fcdb7a11] [.s.b.w.s.s.ErrorPageFilter:186] [27.0.0.1-8040-exec-2] - Forwarding to error page from request [/api/v1/registry/join/router] due to exception [org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: java/security/interfaces/RSAPrivateKey] javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: java/security/interfaces/RSAPrivateKey
ResolutionTo see how related classes are being loaded into Artifactory’s JVM, one needs to examine Java class logging (which keeps track of class loading and unloading) for further diagnosis.
For Artifactory 7.x:Add “-verbose:class” to extraJavaOpts in the system.yaml file. For e.g.
extraJavaOpts: "-server -Xms512m -Xmx2g -Xss256k -XX:+UseG1GC -verbose:class"
Sample entries from console.log:
[4.800s][info][class,load] java.sql.Driver source: jrt:/java.sql [4.801s][info][class,load] com.mysql.jdbc.NonRegisteringDriver source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/lib/jf_mysql-connector-java-5.1.49.jar [4.801s][info][class,load] com.mysql.jdbc.Driver source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/lib/jf_mysql-connector-java-5.1.49.jar [4.801s][info][class,load] java.sql.Connection source: jrt:/java.sql [4.801s][info][class,load] com.mysql.jdbc.AbandonedConnectionCleanupThread source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/lib/jf_mysql-connector-java-5.1.49.jar [4.802s][info][class,load] com.mysql.jdbc.AbandonedConnectionCleanupThread$1 source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/lib/jf_mysql-connector-java-5.1.49.jar [4.815s][info][class,load] com.fasterxml.classmate.TypeResolver source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.815s][info][class,load] com.fasterxml.classmate.ResolvedType source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.816s][info][class,load] com.fasterxml.classmate.types.ResolvedRecursiveType source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.816s][info][class,load] com.fasterxml.classmate.types.ResolvedArrayType source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.816s][info][class,load] com.fasterxml.classmate.types.ResolvedInterfaceType source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.817s][info][class,load] com.fasterxml.classmate.types.ResolvedObjectType source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.818s][info][class,load] com.fasterxml.classmate.members.RawMember source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.818s][info][class,load] com.fasterxml.classmate.members.RawConstructor source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.818s][info][class,load] com.fasterxml.classmate.members.RawField source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.818s][info][class,load] com.fasterxml.classmate.members.RawMethod source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar [4.819s][info][class,load] com.fasterxml.classmate.TypeBindings source: file:/opt/jfrog/artifactory/app/artifactory/tomcat/webapps/access/WEB-INF/lib/classmate-1.4.0.jar
For Artifactory 6.x:Modify JAVA_OPTIONS in $ARTIFACTORY_HOME/bin/artifactory.default file or as outlined at: Setting JVM parameters. For e.g.
export JAVA_OPTIONS="-server -Xms512m -Xmx4g -Xss256k -XX:+UseG1GC -XX:OnOutOfMemoryError=\"kill -9 %p\" -verbose:class"
Sample entries from catalina.out:
[2.139s][info][class,load] java.sql.Driver source: jrt:/java.sql [2.139s][info][class,load] org.apache.derby.jdbc.EmbeddedDriver source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/lib/derby-10.14.2.0.jar [2.139s][info][class,load] java.sql.SQLNonTransientException source: jrt:/java.sql [2.139s][info][class,load] java.sql.SQLFeatureNotSupportedException source: jrt:/java.sql [2.140s][info][class,load] org.springframework.format.datetime.joda.YearMonthFormatter source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/webapps/access/WEB-INF/lib/spring-context-5.1.15.RELEASE.jar [2.140s][info][class,load] java.sql.DriverManager source: jrt:/java.sql [2.140s][info][class,load] java.sql.SQLPermission source: jrt:/java.sql [2.141s][info][class,load] org.apache.derby.iapi.jdbc.JDBCBoot source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/lib/derby-10.14.2.0.jar [2.141s][info][class,load] org.joda.time.MonthDay source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/webapps/access/WEB-INF/lib/joda-time-2.9.7.jar [2.141s][info][class,load] org.springframework.format.datetime.joda.MonthDayFormatter source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/webapps/access/WEB-INF/lib/spring-context-5.1.15.RELEASE.jar [2.142s][info][class,load] org.apache.derby.iapi.services.monitor.ModuleControl source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/lib/derby-10.14.2.0.jar [2.142s][info][class,load] org.springframework.format.datetime.joda.JodaDateTimeFormatAnnotationFormatterFactory source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/webapps/access/WEB-INF/lib/spring-context-5.1.15.RELEASE.jar [2.142s][info][class,load] org.apache.derby.jdbc.InternalDriver source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/lib/derby-10.14.2.0.jar [2.143s][info][class,load] org.apache.derby.iapi.services.io.TypedFormat source: file:/Users/venur/dev/art-rel/artifactory-pro-6.23.21/tomcat/lib/derby-10.14.2.0.jar
- If nothing is being loaded from the expected location of the class, take a look at Java CLASSPATH and make sure it’s part of it.
- If some classes are being loaded from that location, it could be that another JAR file that contains that class is missing. Check Javadocs for the class in question.
Note: Once the problem is resolved, turn off the verbose logging as it can affect the application’s performance.