Confluence 8.8 is available now

Hi everyone,

Confluence 8.8 is available now.

This release supports only Data Center licenses. If you have a Server license, check out your options for upgrading.

Download the latest version

This GA release was made available on 8 February 2024.

What’s new?

    • Delete multiple attachments at once
  • New REST APIs for easier content management
  • Encrypted user directory server passwords
  • New health checks in the ATST app
  • New infrastructure metrics for in-product diagnostics
  • More accessibility improvements

Check out the [Confluence 8.8 Release Notes] (Confluence 8.8 release notes | Confluence Data Center and Server 8.8 | Atlassian Documentation) to learn more.

2 Likes

That was really fast. A lot of vendors still have problems upgrading to Platform 6.5 - me included.

I just build my App against the beta and now the RC but the final 8.8.0 release gives me this error on App Startup:

:green_circle: UPDATE I got it working.

:zero: The app uses/provides

  • httpclient
  • google Gson
  • provides REST API
  • provides Confluence Macros

:one: here is the full pom.xml

:two: The REST API stuff is unchanged in atlassian-plugin.xml (No v2 yet!)

:three: We build with Atlassian SDK 8.2.8 and JDK 11

:four: Things I changed in my code (also as preparation for Confluence 9)

  • Replace @PostConstruct and @PreDestroy with Spring InitializingBean
  • Replace @JsonProperty with @XmlElement
  • build chain changed to use temurin java 11 + Atlassian sdk 8.2.8 + amps 8.10.1 in pom
  • replace SettingsManager by GlobalSettingsManager
  • logging: only slf4j-api is scope=compile and everything else scope=test
  • Replaced Guava with vanilla java logic
  • Removed Jacksondependencies => Use JaxRS json/xml logic
  • Removed @Named and @Inject => @Component + @Autowired
  • Refactored User to ConfluenceUser
5 Likes

What to do with REST API service developed using this tutorial - https://developer.atlassian.com/server/framework/atlassian-sdk/rest-plugin-module/ !?!??!

These are missing now…

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

:frowning:

2 Likes

I just ran into the missing upload app button in Bitbucket and I have to say that’s the absolutely most ridiculous change I’ve ever seen Atlassian do.

6 Likes

Well there is the “email 2FA” that we have to enter to log into the Marketplace, which I’m reminded of several times a week.

Atlassian usually does an extensive market study before implementing features. I’ll trust them that the “long pathway to downgrade an app” has a reason, even if not communicated publicly.

2 Likes

I’m glad to hear you got it working, @clouless. I’ve passed your feedback onto our devs. Also just confirming that our release cycle has not sped up, but it might feel like it with our focus on improving security lately.

1 Like

Thanks for raising this @sash011. I have passed your query onto our dev team, so hopefully someone will be along soon to take a look at this.

You can see the missing Upload App button if running Confluence in dev mode or pass this flag -Dupm.plugin.upload.enabled=true to Confluence

@clouless

Thanks for the feedback.
Regarding point 2:
“The REST API stuff is unchanged in atlassian-plugin.xml” → The RESTV2 plugin would be bundled in 8.9 and 9.0. It is actually already available in 8.9.0-m16 and 9.0.0-m09.

Also, want to understand the following better:
" Replace @JsonProperty with @XmlElement"
Why are we doing this?

Thanks

@SujayCHegde

Is there already a Docker Image for 8.9.0-m16? I cannot find one. When will 8.9 EAP/Beta be available?

:one: :zap: In 9.0.0-m09 the v2 REST API thing is broken, I think @mkemp confirmed this in the Confluence 9.0 thread. And since 8.9.0 Docker image is not yet available, I cannot test it.

I See this error in the logs, and the REST API Endpoints all return 404:

2024-02-11 20:08:20,484 ERROR [http-nio-8090-exec-8] [atlassian.plugin.servlet.DefaultServletModuleManager] getInstance Unable to create new reference LazyLoadedFilterReference{descriptor=myappkey:restAc-filter (Provides REST resources.), filterConfig=com.atlassian.plugin.servlet.filter.PluginFilterConfig@de5ee94}
 -- url: /rest/myappkey/1/download_config/json | userName: admin | referer: http://192.168.178.73:8090/display/AAA/dsf | traceId: 3512b39049d10c12
io.atlassian.util.concurrent.LazyReference$InitializationException: A MultiException has 2 exceptions.  They are:
1. java.util.ServiceConfigurationError: com.fasterxml.jackson.databind.Module: Provider com.fasterxml.jackson.datatype.jdk8.Jdk8Module not found
2. java.lang.IllegalStateException: Unable to perform operation: post construct on org.glassfish.jersey.jackson.internal.DefaultJacksonJaxbJsonProvider

        at io.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:156)
        at io.atlassian.util.concurrent.LazyReference.get(LazyReference.java:116)
        at com.atlassian.plugin.servlet.DefaultServletModuleManager.getInstance(DefaultServletModuleManager.java:431)

:two: I removed @JsonProperty and @JsonAutoDetect since in Confluence 9.0 (Grey Api Removal) all Jackson dependencies will no longer be provided by the host application. Meaning: I would need to bundle a lot of Jackson dependencies myself, and I do not want to do that.
Therefore - in cases where I use GSON to produce JSON (mostly in unit tests) - I tweaked GSON to understand @XmlElement the same way as @JsonProperty.
In case of of REST API Response, the JAX-RS will now produce JSON for me with XmlElement/XmlRootElement.

:three: Where is the detailed REST V2 migration documentation?

@clouless
Sorry for that.
This thread Platform 7 upgrade in progress: Learn about the first highlights and changes - #13 by MarekTokarski has details on RestV2 issues and migration documentation.

Let me know if it is helpful.

Thanks

Hi @SujayCHegde,

thanks but I am already omni-present on all the threads :smiley:
Have asked all the questions everywhere. No real helpful answers yet.
So we just have to wait it seems …

I cannot get our app running on Confluence 8.8.0 with the Atlassian SDK. It worked with the 8.8.0-beta1, but from RC1 on, I get the following error using

  • Java Spring Config using atlassian-plugins-osgi-javaconfig 0.6.0
  • AMPS 8.13.1
[INFO] [talledLocalContainer] 11:28:30,283 INFO [FelixDispatchQueue] [container.felix.FelixOsgiContainerManager] bundleChanged Installed bundle de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros (308)
[INFO] [talledLocalContainer] 11:28:30,298 WARN [UpmAsynchronousTaskManager:thread-1] [hook.dmz.DmzResolverHook] filterMatches Package org.apache.commons.lang3 is deprecated and is not available for export to plugin de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] 11:28:30,298 ERROR [UpmAsynchronousTaskManager:thread-1] [osgi.factory.OsgiPluginInstalledHelper] availableForTraversal Cannot determine required plugins, cannot resolve bundle 'de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros'
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] 11:28:30,306 INFO [UpmAsynchronousTaskManager:thread-1] [plugin.manager.PluginEnabler] actualEnable Resolving 1 plugins
[INFO] [talledLocalContainer] 11:28:30,312 WARN [UpmAsynchronousTaskManager:thread-1] [hook.dmz.DmzResolverHook] filterMatches Package org.apache.commons.lang3 is deprecated and is not available for export to plugin de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] 11:28:30,312 INFO [UpmAsynchronousTaskManager:thread-1] [plugin.manager.PluginEnabler] actualEnable Enabling 1 plugins: [de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros]
[INFO] [talledLocalContainer] 11:28:30,318 WARN [UpmAsynchronousTaskManager:thread-1] [hook.dmz.DmzResolverHook] filterMatches Package org.apache.commons.lang3 is deprecated and is not available for export to plugin de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] 11:28:30,319 ERROR [UpmAsynchronousTaskManager:thread-1] [osgi.factory.OsgiPlugin] enableInternal Detected an error (BundleException) enabling the plugin 'de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros' : Unable to resolve de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros [308](R 308.0): missing requirement [de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros [308](R 308.
0)] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.lang3) Unresolved requirements: [[de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros [308](R 308.0)] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.lang3)].  This error usually occurs when your plugin imports a package from another bundle with a specific version constraint and either the bundle providing that package doesn't meet those version constraints, or there is no bundle available that provides the specified package. For more details on how to fix this, see https://developer.atlassian.com/x/mQAN
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] 11:28:30,320 WARN [UpmAsynchronousTaskManager:thread-1] [plugin.impl.AbstractPlugin] enable Unable to enable plugin 'de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros'
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] 11:28:30,320 WARN [UpmAsynchronousTaskManager:thread-1] [plugin.impl.AbstractPlugin] enable Because of this exception
[INFO] [talledLocalContainer]  -- url: /confluence/rest/plugins/1.0/ | userName: admin | traceId: d9968791e228fb65
[INFO] [talledLocalContainer] com.atlassian.plugin.osgi.container.OsgiContainerException: Cannot start plugin: de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros
[INFO] [talledLocalContainer]   at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:423)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.impl.AbstractPlugin.enable(AbstractPlugin.java:260)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.PluginEnabler.actualEnable(PluginEnabler.java:120)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.PluginEnabler.enable(PluginEnabler.java:97)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.DefaultPluginManager.lambda$enableDependentPlugins$24(DefaultPluginManager.java:1244)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.PluginTransactionContext.wrap(PluginTransactionContext.java:63)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.manager.DefaultPluginManager.enableDependentPlugins(DefaultPluginManager.java:1228)
 
<... SNIP ...>
 
[INFO] [talledLocalContainer] Caused by: org.osgi.framework.BundleException: Unable to resolve de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros [308](R 308.0): missing requirement [de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros [308](R 308.0)] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.lang3) Unresolved requirements: [[de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros [308](R 308.0)] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.lang3)]
[INFO] [talledLocalContainer]   at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4398)
[INFO] [talledLocalContainer]   at org.apache.felix.framework.Felix.startBundle(Felix.java:2308)
[INFO] [talledLocalContainer]   at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:1006)
[INFO] [talledLocalContainer]   at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:992)
[INFO] [talledLocalContainer]   at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:404)
[INFO] [talledLocalContainer]   ... 106 more

Adding the dependency to commons-lang (scope compile instead of provided) won’t do the trick, since the enforcer tells me to not do so.

[INFO] validate banned dependencies
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BannedDependencies failed with message:
make sure platform artifacts are not bundled into plugin
Found Banned Dependency: org.apache.commons:commons-lang3:jar:3.14.0
Use 'mvn dependency:tree' to locate the source of the banned dependencies.

commons-lang ist just one example here.

I am under the impression that the correct imports are generated for me due to the Java Spring Config configuration using atlassian-plugins-osgi-javaconfig. Am I wrong?

What is the difference between versions 8.8.0-beta1 and 8.8.0 and how can I start the Confluence server in version 8.8.0 in the developer environment and deploy the app successfully? Would I need to automatically generate the imports for the app, but manually crafting the list of banning excludes as shown by @clouless in his POM? Not that I would come very far without a further clues :wink:

[INFO] [talledLocalContainer] 13:56:29,599 INFO [UpmAsynchronousTaskManager:thread-2] [plugin.manager.PluginEnabler] actualEnable Resolving 1 plugins
[INFO] [talledLocalContainer] 13:56:29,604 WARN [UpmAsynchronousTaskManager:thread-2] [hook.dmz.DmzResolverHook] filterMatches Package org.eclipse.gemini.blueprint.context is deprecated and is not available for export to plugin de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros

Hi rr1,

You can use 8.8.0 and not the beta. At the time of writing it was 8.8.0-beta1 and now they have already released 8.8.0. But then your app is only compatible 8.8.0+ => So at best you compile it against 8.8.0 and once that all works, change it to 8.5.0 LTS to support latest LTS. In my case I made a new major version of my app only compatible 8.8+ and once some security fix needs to be done, I will back port it to 7.19-8.7 range.

Anyways: You seem to have some dependency with something like de.smartics.atlassian.confluence.smartics-atlassian-confluence-macros and need to use <scope>compile</scope> AND then you need to do

            <plugin>
                <groupId>com.atlassian.maven.plugins</groupId>
                <artifactId>confluence-maven-plugin</artifactId>
                <version>${amps.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <banningExcludes>
...
                        <exclude>org.apache.commons:commons-lang3</exclude>
...
                    </banningExcludes>
...
                    <instructions>
                        <Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>
                        <Export-Package />
                        <Import-Package>
                         !de.smartics.atlassian.confluence.*,
...

The !something.foo.*, tells the OSGI monster to NOT ask Confluence for your dependency, but instead use the bundled one aka <scope>compile</scope>.

I hope this helps.

And about atlas-run => I stopped using that years ago. I also have a dockerized Confluence running with PostgreSQL dockerized => I use some CURL commands to upload the jar and then docker logs like:

atlas-package && ./upload-jar.sh

docker exec confluence88 cat logs/atlassian-confluence.log

This way you also see the logs and the OSGI errors.

I hope this helps somehow.

2 Likes

Also , “When will 8.9 EAP/Beta be available?”.
Need to wait till month end. Not sure about exact date :frowning:

HI @clouless

Ok. So the tentative dates for 8.9 are.

EAP1 - 26th Feb
EAP2 - 4th March
EAP3 - 11th March

Beta Release - 18th March
RC - 25th March
Public Release - 2nd April.

The dates are tentative and subject to minor changes.

Thanks

2 Likes

Thank you, @clueless, for your detailed explanation!

I think I understand now better how the banning excludes and the package imports play together. I was also unaware before I read your POM that I can prevent certain imports explicitly (seems I am really enjoying the simplicity of all that Java Spring Configuration provides :slight_smile: ). Thank you for sharing!

I managed to find the issue with my local configuration that prevent the deployment of my app to the development environment. So it seems that my app has an easier workaround to the changes between the Beta 1 and RC 1.

With the following the OSGi complaints on the locally started server went away (has been true before):

<atlassian.dev.mode>false</atlassian.dev.mode>

We are also used to deploy to the local server remotely. Therefore we need to set the new system property:

<systemProperties>
     <upm.plugin.upload.enabled>true</upm.plugin.upload.enabled>
</systemProperties>

Edit: According to https://developer.atlassian.com/server/framework/atlassian-sdk/amps-build-configuration-reference/ the system properties should be set like this:

<systemPropertyVariables>
     <upm.plugin.upload.enabled>true</upm.plugin.upload.enabled>
</systemPropertyVariables>
2 Likes

Thanks for pom @clouless

I tried your pom with minor modifications, where you did not provide data with one simple class, unfortunately the application on 8.8 does not start at all :frowning:

Can someone from Atlassian tell us how to run a simple application on version 8.8?

UPDATE

After a few hours of playing around with the issue while building the app to version 8.8, I came to the conclusion that the Atlassian SDK simply doesn’t work. My plug-in compiled correctly during the standard process using atlas-package, but when uploading it to the environment (Quick Reload) via the atlas-run command, an OSGI problem occurred every time.

After switching to Confluence installed via a file (ZIP, TAR, BIN) with a separate PSQL database, the application behaves correctly and the same compiled JAR file works correctly.

Dear Atlassian, can you officially fix the SDK and describe what steps should be taken and what versions should be used to make the development of applications using the SDK possible for Confluence 8.8 (and higher)?

2 Likes

Hi adam,
congratz on getting it work :muscle: .

I did this all on the Weekend from Friday to Sunday with late shifts for my app and I really thought I was going nuts …
It is really a hassle, and yes I do not trust atlas-run anymore too. Only the official docker images can be trusted :frowning:

Very sad, I really wish Atlassian would invest in the Developer Experience on Data Center as well.

3 Likes

Confluence “polyfills”:

For everyone struggling with ensuring that their app is compatible with 7.19-8.8, I believe I’ve succeeded to do it (pending feedback from customers, but it seems to work well) by having 1 library compiling against each version of Confluence, then shipping all those jars into the same plugin jar, then choosing dynamically at runtime which implementation it uses. So:

  • my-polyfill-confluence-7.19.jar implements an interface
  • my-polyfill-confluence-7.20.jar implements the same interface, etc., each compiling against their version of Confluence, so I have autocompletion and compile-time check that I’m not using an invalid class,
  • In the final utils-confluence.jar, a FactoryBean which chooses the final implementation, which uses AutowireCapableBeanFactory to autowire the final jar,
  • I end up with using my interface, such as “CQLSearchAdaptor” or “PermissionAdaptor”, in my plugin, which then works seamlessly.

The (redacted) pom.xml and Java classes are demonstrated there: https://github.com/requirement-yogi/demo-confluence-polyfills/blob/master/libs/utils-confluence/src/main/java/com/requirementyogi/server/utils/confluence/compat/PermissionAdaptorFactoryBean.java

Haven’t tried it with Confluence 9.0, but I’ve found it was an (excellent) architectural idea when someone told me about it (I don’t remember who, sorry for not being to attribute it).

3 Likes