Preparing for Jira Software 10.0 and Jira Service Management 6.0 - multiple EAPs coming your way

Hello! When I upload my jira custom plugin it is being automatically disabled with the following error message:

Caused by: org.osgi.framework.BundleException: Unable to resolve com.plugin.key : missing requirement [com.plugin.key[)] osgi.ee; (osgi.ee=UNKNOWN) Unresolved requirements: [[com.plugin.key osgi.ee; (osgi.ee=UNKNOWN)]

Can you advise how to debug problem further
Thanks

Hello all,

I’m trying to build a version of our app on Jira 10, I migrated our services to REST v2 and at first glance it seemed fine
However after a bit more testing some functionalities were broken and so far I seem to have tracked it down to some of our Servlet Filters not being executed. It seems that any filter with location after-decoding or before-login is just not executed. In fact if I take my filter and just switch it to before-decoration then its doFilter method is called.
Obviously I can’t just switch all my before-login filters to a later location so I’m wondering if anyone has run into this issue of has any idea how that can be solved

Regards,
Mathieu

Hello, I am trying to use AbstractBinder from hk2. However I am getting an exception:

Caused by: java.lang.ClassNotFoundException: org.glassfish.hk2.utilities.binding.AbstractBinder not found by com.intenso.jira.plugins.ad-integration-manager [183]
	at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1591)
	at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1976)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)

Our plugin imports the package:


Which is exported by Jira’s System Bundle:

This is Jira 10.0 release
Could you please help me?

Hello!

Since you have added the possibility to store attachments in S3 without the previous needed flag, I was wondering what’s the way to check the attachments location now. I am looking for a solution to see if they are stored on server or in S3. I know I can check the Jira home/data/attachments directory and see if it’s empty, but I was hoping for a service or something, since there is no guarantee customers will move the previous attachments and not copy them to S3. I could also check the filestore-config.xml and see if it’s there, but again, I was hoping for a safer solution.

Thank you!

If anyone’s interested I was finally able to find the right doc which almost entirely explains what I’m seeing: https://developer.atlassian.com/platform/marketplace/dc-apps-platform-7-preparing-for-secure-endpoints/#overview-of-changes
Most notably:

  • UnrestrictedAccess annotations now apply to servlet-filters and servlets as well (pretty logical and my main assumption at the time)
  • Contrary to REST endpoints which can accept com.atlassian.plugins.rest.api.security.annotation the servlet artifacts can only use com.atlassian.annotations.security (this is where I wasted a lot of time because I only tried with the rest.api annotations at first)
  • Every filter in location after-encoding or before-login is assumed to be un-authenticated (obviously it isn’t when the filter is supposed to execute but the request can be properly logged in down the chain) and has to be annotated UnrestrictedAccess

The last point isn’t really documented but it is somewhat logical (although Jira could just as well assume any before-login servler-filter is UnrestrictedAccess because what else could it be)

I have one more problem regarding Jira 10 upgrade. In our app we extend com.atlassian.jira.plugins.userprofile.AbstractUserProfilePanel
from com.atlassian.jira:jira-user-profile-plugin:6.0.0 (Jira 10).
It’s causing following error upon plugin start:

2024-09-09 16:57:27,878+0200 ThreadPoolAsyncTaskExecutor::Thread 25 ERROR      [o.e.g.b.e.i.dependencies.startup.DependencyWaiterApplicationContextExecutor] Unable to create application context for [com.intenso.jira.plugins.ad-integration-manager], unsatisfied dependencies: none
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.intenso.jira.plugins.admanager.panel.CustomFieldPortalPanel]; nested exception is java.io.FileNotFoundException: OSGi resource[classpath:com/atlassian/jira/plugins/userprofile/AbstractUserProfilePanel.class|bnd.id=245|bnd.sym=com.intenso.jira.plugins.ad-integration-manager] cannot be resolved to URL because it does not exist
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247)
	at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.invokeBeanDefinitionRegistryPostProcessors(AbstractDelegatedExecutionApplicationContext.java:521)
	at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.invokeBeanFactoryPostProcessors(AbstractDelegatedExecutionApplicationContext.java:419)
	at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.invokeBeanFactoryPostProcessors(AbstractDelegatedExecutionApplicationContext.java:359)
	at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:251)
	at org.eclipse.gemini.blueprint.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
	at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:217)
	at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:224)
	at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:177)
	at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:154)
	at org.eclipse.gemini.blueprint.extender.internal.activator.LifecycleManager$1.run(LifecycleManager.java:213)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.io.FileNotFoundException: OSGi resource[classpath:com/atlassian/jira/plugins/userprofile/AbstractUserProfilePanel.class|bnd.id=245|bnd.sym=com.intenso.jira.plugins.ad-integration-manager] cannot be resolved to URL because it does not exist
	at org.eclipse.gemini.blueprint.io.OsgiBundleResource.getURL(OsgiBundleResource.java:229)
	at org.eclipse.gemini.blueprint.io.OsgiBundleResource.getInputStream(OsgiBundleResource.java:181)
	at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:55)
	at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48)
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
	at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123)
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:81)
	at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:699)
	at org.springframework.context.annotation.ConfigurationClassParser$SourceClass.getSuperClass(ConfigurationClassParser.java:1013)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:340)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:180)
	... 15 more

Everything works on Jira 9.x with the same lib but different version (3.0.8, provided).
Any changes here?

I see there is an explicit exclusion for both packages

org.glassfish.hk2.*
org.glassfish.jersey.*

in
.../atlassian-jira-software-10.0.1-standalone/atlassian-jira/WEB-INF/classes/osgi/public-packages-excludes.txt
which prevents our plugin access to them.

Is there any workaround?
Regards