Attachments are not available with ClassNotFoundException or 404 in the UI after upgrading to 8.15.0 or newer

Platform Notice: Data Center Only - This article only applies to Atlassian products on the Data Center platform.

Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data-Center-specific features may also work for Server versions of the product, however they have not been tested. 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.

*Except Fisheye and Crucible

Summary

Problem

After upgrading to Jira 8.15.0 or later, issue attachments and thumbnails are no longer accessible and opening them results in a dead link 404 and/or 500 error message.

The following appears in the atlassian-jira.log:

1 2 3 4 5 6 7 8 9 10 11 12 2021-02-11 15:43:26,634-0600 http-1 ERROR [o.a.c.c.C.[.[x].[x].[viewattachment]] Allocate exception for servlet [viewattachment] java.lang.ClassNotFoundException: com.atlassian.jira.web.servlet.ViewAttachmentServlet at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:545) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:526) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150) ... 16 filtered at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2021-02-11 15:43:26,637-0600 http-1 ERROR /internal-error [c.a.j.web.servlet.InternalServerErrorServlet] {errorId=x, interpretedMsg=, cause=java.lang.ClassNotFoundException: com.atlassian.jira.web.servlet.ViewAttachmentServlet, stacktrace=java.lang.ClassNotFoundException: com.atlassian.jira.web.servlet.ViewAttachmentServlet at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358) [catalina.jar:8.5.60] at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180) [catalina.jar:8.5.60] at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:545) [catalina.jar:8.5.60] at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:526) [catalina.jar:8.5.60] at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150) [catalina.jar:8.5.60] at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1044) [catalina.jar:8.5.60] at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:763) [catalina.jar:8.5.60] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134) [catalina.jar:8.5.60] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [catalina.jar:8.5.60] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) [catalina.jar:8.5.60] at org.apache.catalina.valves.StuckThreadDetectionValve.invoke(StuckThreadDetectionValve.java:206) [catalina.jar:8.5.60] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [catalina.jar:8.5.60] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.60] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [catalina.jar:8.5.60] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) [catalina.jar:8.5.60] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:8.5.60] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616) [tomcat-coyote.jar:8.5.60] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-coyote.jar:8.5.60] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) [tomcat-coyote.jar:8.5.60] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1634) [tomcat-coyote.jar:8.5.60] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.60] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_162] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_162] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.60] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_162] , referer=x, servletErrorMessage=}

Diagnosis

Environment

  • You are using a modified <jira-install>/atlassian-jira/WEB-INF/web.xml file.

Diagnostic Steps

  • The attachment path is correct in the startup log or by viewing the ⚙️ → System → Attachments page.

  • The attachment files are available and accessible by the Jira user in the above directory.

Cause

In Jira 8.15.0, several class files were migrated to a new package:

  • Previous directory: <jira-install>\atlassian-jira\WEB-INF\classes\com\atlassian\jira\web\servlet\

  • New directory: <jira-install>\atlassian-jira\WEB-INF\classes\com\atlassian\jira\web\servlet\viewfile

  1. AbstractViewFileServlet$JwtAttachmentPermissionException.class

  2. AbstractViewFileServlet.class

  3. RangeRequest.class

  4. RangeResponse.class

  5. ViewAttachmentServlet.class

  6. ViewTemporaryAttachmentServlet$ParsedQuery.class

  7. ViewTemporaryAttachmentServlet.class

  8. ViewThumbnailServlet.class

This change was implemented as a fix for JRASERVER-41675 - Wiki markup embedded images are not shown in email notifications and you can read more about this in the Jira Software 8.15.x upgrade notes.

Solution

Workaround

When upgrading, make sure to use the new web.xml file and copy your custom modifications to it rather then using the old file. Otherwise, Jira will look for old servlets and attachments won't be displayed. The changes for attachments specifically are outlined below:

web.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 <servlet> <servlet-name>viewattachment</servlet-name> <servlet-class>com.atlassian.jira.web.servlet.viewfile.ViewAttachmentServlet</servlet-class> </servlet> <servlet> <servlet-name>viewtemporaryattachment</servlet-name> <servlet-class>com.atlassian.jira.web.servlet.viewfile.ViewTemporaryAttachmentServlet</servlet-class> </servlet> <servlet> <servlet-name>viewthumbnail</servlet-name> <servlet-class>com.atlassian.jira.web.servlet.viewfile.ViewThumbnailServlet</servlet-class> </servlet>

After changing the web.xml on each Jira node, you may restart one-at-a-time so they pick up the change (no need to bring the whole cluster down at the same time).

Updated on April 2, 2025

Still need help?

The Atlassian Community is here for you.