RFCs are a way for Atlassian to share what we’re working on with our valued developer community.
It’s a document for building shared understanding of a topic. It expresses a technical solution, but can also communicate how it should be built or even document standards. The most important aspect of an RFC is that a written specification facilitates feedback and drives consensus. It is not a tool for approving or committing to ideas, but more so a collaborative practice to shape an idea and to find serious flaws early.
Please respect our community guidelines: keep it welcoming and safe by commenting on the idea not the people (especially the author); keep it tidy by keeping on topic; empower the community by keeping comments constructive. Thanks!
Project Summary
As part of the upcoming major release of Atlassian Data Center products, we are reviewing which third-party libraries are exported through the Data Center public API. We are proposing to stop exporting a number of third-party libraries, which means they would no longer be provided by the host product to plugins at runtime. Affected apps would need to bundle these libraries themselves.
This RFC covers all Data Center products: Jira Software/JSM 12, Confluence 11, Bitbucket 11, Bamboo 13 and Crowd 8.
- Publish: 2026-04-21T22:00:00Z
- Discuss: 2026-05-12T22:00:00Z
- Resolve: 2026-05-26T22:00:00Z
Problem
What is the problem?
Atlassian Data Center products currently export many third-party libraries through their public API. This means that apps (plugins) can import these library packages at runtime from the host product via OSGi, without bundling them.
While this was convenient when it was introduced, it creates several long-term challenges:
- Security response time: When a library is part of the public API, upgrading it is a backward-incompatible change. Even critical CVE patches require coordination with the entire app ecosystem, slowing response from days to weeks.
- Version lock-in: Apps are tied to whatever version of a library the DC products ship. They cannot use newer versions with bug fixes or features, nor can they stay on an older version that they have tested against.
- Upgrade friction: Every major release upgrade that bumps a public API library version risks breaking apps that depend on specific behaviors of the old version.
- Stable support commitment: The upcoming major release of Data Center products is designed for long-term stability. Each library exposed on the public API is a commitment to maintain it without frequent disruptive changes.
Who has the problem?
- Atlassian: maintaining version compatibility across a large set of exported libraries constrains our ability to respond to security issues and evolve our Data Center products.
- App vendors: locked to the DC product’s library version, unable to independently manage their own dependency lifecycle.
- Customers: delayed security patches and slower product evolution.
Why does it need to be solved now?
This upcoming major version release is a natural boundary point to make backward-incompatible changes. Once these DC products ship, the public API surface will be locked for the extended support lifecycle. Reducing the API surface now avoids locking in commitments that will constrain security responses for years to come.
What benefit is there to solving the problem?
- Atlassian can patch library CVEs independently of app ecosystem coordination.
- App vendors gain freedom to pin the exact library version they need.
- Reduced public API surface means fewer surprise breakages during future upgrades.
- Smaller API commitment during the extended support phase.
Proposed Solution
Overview
We propose to remove a number of third-party libraries from the Data Center public API. Concretely, this means:
- Data Center products will stop exporting these library packages to apps via OSGi.
- The libraries may still remain on the product’s internal classpath for Atlassian’s own use, but apps will no longer be able to rely on them being available at runtime.
- Apps that depend on these libraries will need to bundle them directly — include the JAR in the app’s build.
Libraries proposed for removal
The following libraries are proposed for removal from the Data Center public API. For each library we list the primary Java package prefix and the products that currently export it. If your app targets a product not listed for a given library, your app is not affected by that specific change.
Exported by all (or most) products:
- Bouncy Castle (
org.bouncycastle) — Jira, Confluence, Bitbucket, Crowd, Bamboo - Commons Codec (
org.apache.commons.codec) — Jira, Confluence, Bitbucket, Crowd, Bamboo - Commons Collections 3 (
org.apache.commons.collections) — Jira, Confluence, Bitbucket, Crowd, Bamboo - Commons IO (
org.apache.commons.io) — Jira, Confluence, Bitbucket, Crowd, Bamboo - Commons Lang 3 (
org.apache.commons.lang3) — Jira, Confluence, Bitbucket, Crowd, Bamboo - Commons Text (
org.apache.commons.text) — Jira, Confluence, Bitbucket, Crowd, Bamboo - org.json (
org.json) — Jira, Confluence, Bitbucket, Crowd, Bamboo - net.oauth (
net.oauth) — Jira, Confluence, Crowd, Bamboo - JSoup (
org.jsoup) — Jira, Confluence, Crowd, Bamboo - Xerces (
org.apache.xerces) — Jira, Confluence, Crowd, Bamboo
Exported by a subset of products:
- Checker Qual (
org.checkerframework) — Confluence, Crowd, Bamboo - Xalan (
org.apache.xalan,org.apache.xml.serializer) — Confluence, Crowd, Bamboo - XStream (
com.thoughtworks.xstream) — Confluence, Bamboo - Stax2 API (
org.codehaus.stax2) — Confluence, Bamboo - JDOM 2 (
org.jdom2) — Jira, Bamboo - Joda-Time (
org.joda.time) — Jira, Bamboo - ROME (
com.rometools) — Jira, Bamboo - log4j-core (
org.apache.logging.log4j.core) — Jira, Bamboo - ORO (
org.apache.oro) — Jira, Bamboo - OpenSymphony OSCore (
com.opensymphony.util) — Jira, Confluence - JTidy (
org.w3c.tidy) — Jira, Confluence - Reactive Streams (
org.reactivestreams) — Crowd, Bamboo - Gson (
com.google.gson) — Bamboo - Commons Lang 2 (
org.apache.commons.lang) — Bamboo - Commons BeanUtils (
org.apache.commons.beanutils) — Bamboo - Commons Collections 4 (
org.apache.commons.collections4) — Bamboo - Commons Compress (
org.apache.commons.compress) — Bamboo - Commons Configuration (
org.apache.commons.configuration) — Bamboo - Commons CLI (
org.apache.commons.cli) — Bamboo - Commons Daemon (
org.apache.commons.daemon) — Bamboo - Commons Digester (
org.apache.commons.digester) — Bamboo - Commons JXPath (
org.apache.commons.jxpath) — Bamboo - Commons Validator (
org.apache.commons.validator) — Bamboo - Commons FileUpload 2 (
org.apache.commons.fileupload2) — Jira - Commons Pool 2 (
org.apache.commons.pool2) — Jira - JFreeChart (
org.jfree) — Jira, Bamboo - ROME 1.0 (
com.sun.syndication) — Jira - ICU4J (
com.ibm.icu) — Confluence - Logback (
ch.qos.logback) — Bitbucket
Note on log4j: Only log4j-core (the implementation) is proposed for removal. log4j-api (the logging facade) will remain on the public API. Standard logging via LogManager.getLogger() is unaffected.
Developer experience: How to check if your app is affected
Your app is affected if it imports packages from any of the proposed-for-removal libraries and relies on the host product to provide them (i.e., does not already bundle the library).
Step 1: Check your app’s OSGi Import-Package header
The most reliable way to determine what your app imports from the host product is to inspect the Import-Package header in your app’s built JAR file:
unzip -p your-plugin.jar META-INF/MANIFEST.MF | awk '/^Import-Package:/{found=1} found{if(/^[^ ]/ && !/^Import-Package:/){exit} print}'
Look for any of the package prefixes listed above. If present, your app currently relies on the host product to provide that library.
Step 2: Cross-reference with your source code
Search your Java source files for import statements matching the package prefixes:
grep -rE "import (org\.apache\.commons\.codec|org\.apache\.commons\.collections[^4]|org\.apache\.commons\.io|org\.apache\.commons\.lang3|org\.jsoup|org\.json)" src/
Step 3: Check your build configuration
If your build declares a library with provided scope (Maven) or compileOnly (Gradle), your app depends on the host product to provide it at runtime. If the dependency uses compile scope (default) and is included in your final JAR, you already bundle it and are not affected.
Step 4: Check for transitive dependencies
Some libraries may be pulled in transitively. Check your full dependency tree:
mvn dependency:tree | grep -E "commons-codec|commons-collections|commons-io|jsoup|org.json"
Ecosystem impact: What you need to do if affected
Option A: Bundle the library (recommended, quickest fix)
Change the dependency from provided to compile scope so it gets included in your app’s JAR:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.17.1</version>
<scope>compile</scope> <!-- or without `scope` - `compile` is the default one -->
</dependency>
Most of the shortlisted libraries set for removal are compact, self-contained JAR files with either no or very few transitive dependencies, which simplifies the bundling process. We recognize that these changes could increase the overall application size, and we will factor this consideration into the final decision.
Option B: Migrate to JDK or alternative APIs
Some libraries have direct JDK equivalents:
- Commons Codec (Base64, Hex) →
java.util.Base64,HexFormat(Java 17+) - Commons IO →
java.nio.file.Files,InputStream.transferTo() - Commons Collections 3 →
java.util.stream, Collections API - Commons Lang 3 (partial) →
Objects,String.isBlank()(Java 11+), though no full drop-in replacement exists for the complete StringUtils API
Asks
We are sharing this RFC to gather input from the app developer community before we finalise our decisions. Your feedback matters and will be taken seriously - it is one of several factors we will weigh when deciding which libraries to remove, which to retain, and on what timeline.
Please note that this is not a vote. Feedback from external vendors is an important data point, but our final decisions will be based on a broader multi-factor analysis - including security posture, maintenance burden, ecosystem impact, and product strategy - running in parallel to this feedback period and potentially extending beyond it. We may proceed with removing a library even if we receive objections, if other factors outweigh the concerns raised. Equally, we may decide to retain certain libraries even in the absence of specific feedback, if our deeper analysis points in that direction.
With that context in mind, while we would appreciate any reactions you have to this RFC (even if it’s simply giving it a supportive “Agree, no serious flaws”), we’re especially interested in learning more about:
-
Which specific libraries from the proposed removal list would significantly impact your app(s) if removed? Please be specific about which library, which product(s), and how widely it’s used in your codebase.
-
Are there cases where bundling would be particularly difficult? For example, libraries that must share a single instance with the host product (e.g., shared caches, singletons), or where classloader isolation causes issues.
-
Are there libraries not on this list that you think should also be considered for removal? Or libraries on the “remove” list that you believe should stay, and why?
-
Are there other impacts we haven’t anticipated? For example, interactions between multiple libraries, app-to-app dependencies, or edge cases with specific product versions.