Cannot Upload App From URL error occurs: Could not install the file http://localhost:8080. Check that the file is valid

I am using atlassian-connect-spring-boot-starter (version: 2.3.6) to develop my own Add-on. I’m following this guide ( How to Build a Dynamic Content Macro for Atlassian Confluence Connect - Examples Java Code Geeks - 2023) and with which I succeed to realize my opinion. But when it comes to deploy to use by my company’s Confluence version (Atlassian Confluence 7.13.7), something went wrong.

When I upload App from URL (my addon url is http://localhost:8080) in UPM, error occurs: “Could not install the file xxxxx. Check that the file is valid.”


Localhost in this case refers to the system that is hosting your Jira cloud instance and not your local machine.
In order to install your app running on your local system you will need to use a tool like ngrok. Smply install the tool and in your terminal start it using the command ngrok http 8080 this will start a tunnel and provide a forward url you can use like this -> http://localhost:8080.
Then simply update your app descriptor to set the url as the base url of your app.
Once you start the app you can install it in your Jira instance using the same url.


Hi Mark. Thanks for your answer:
My Confluence instance and Add-on service both run in my Windows computer (so I used localhost). I download Confluence from this site (Confluence Server Download Archives | Atlassian, 7.13.7 - Windows Installer (64 bit)) and run standalonely locally. And then I use atlassian-connect-spring-boot (version: 2.3.6, Spring Boot version: 2.6.9) to develop my add-on.

When I upload App by UPM, error occurs: Could not install the file http://localhost:8080. Check that the file is valid. But I can find the .atlassian-connect JSON file has already been downloaded as it can be found in Confluence installation directory. What makes things worse is that I find no related logs in log files (There is even no more new logs produced when I upload my App).

So could you please help me to figure out what goes wrong.
Thanks you very much again


Hi @Michael6

Aha ok, you cannot develop and deploy a connect app in Confluence Data Center.
The Atlassian Connect framework is only for Cloud deployments.
If you want to develop an app for Confluence Data Center, then you need to develop it using the P2 framework, see Confluence plugin guide

Sorry for the confusion on my end there.


1 Like

Hi @markrekveld
Thanks again for your detail explain.
Could you please tell me how I can store information of my plugin in MySQL, and how my plugin can remote invoke other service (not include the Confluence server) via http request.

Thanks a lot again

Hi @Michael6
You can store data in the database of Confluence by using the ActiveObjects framework, see and

As for connecting to other services I would suggest using the This API is provided by Confluence to connect to external services and takes stuff like proxying into account.
BUt you can also use any of your favourite http client library like OkHttp or HttpClient or even the http client from Java 11

There are also some Confluence examples here

Hi Mark
I’m now develop my plugin as your advice according to Confluence plugin guide. But I find some important requirements cannot meet. Below is my atlassian-plugin.xml.

<parameter name="functionModule" type="enum" required="true" default="Media">
    <value name="func1"/>
    <value name="func2"/>
    <value name="func3"/>
<parameter id="linkeModule" name="linkeModule" type="string" required="true" default=""/>

My requirements is that:

  1. Dynamic update parameters (like add func4, or update func1 to func10, or delete func2) when user edit the Macro.
  2. Get and update the value of linkeModule when user edit the Macro.

Could you please tell me how I can realize it with the related documentation or best practise.

Thanks very much again

Hi @Michael6

It’s been a while since I wrote a Confluence macro, but looking at the docs I think this would be a good place to start,

Is shows a hidden parameter example with custom Javascript, that looks like its a good option for you to use as well.