Cannot create instance of AWS class in bamboo plugin

Hi Henrik,

Following on from this discussion, herewith some more detail.

I added very simple unit tests that assert that instances of selected classes within cloudformation, s3 and sts APIs can be created.

Also like to know what does the number refer to in OSGI errors like missing requirement [115.0]

The POM…

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.reedexpo.cloudformation</groupId>
    <artifactId>cloudFormation</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <organization>
        <name>Example Company</name>
        <url>http://www.example.com/</url>
    </organization>

    <name>cloudFormation</name>
    <description>This is the com.reedexpo.cloudformation plugin for Atlassian Bamboo.</description>
    <packaging>atlassian-plugin</packaging>

    <properties>
        <bamboo.version>6.7.1</bamboo.version>
        <bamboo.data.version>6.7.1</bamboo.data.version>
        <amps.version>8.0.0</amps.version>
        <plugin.testrunner.version>2.0.1</plugin.testrunner.version>
        <atlassian.spring.scanner.version>1.2.13</atlassian.spring.scanner.version>
        <!-- This property ensures consistency between the key in atlassian-plugin.xml and the OSGi bundle's key. -->
        <atlassian.plugin.key>${project.groupId}.${project.artifactId}</atlassian.plugin.key>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <aws.sdk.version>1.11.557</aws.sdk.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.atlassian.bamboo</groupId>
            <artifactId>atlassian-bamboo-web</artifactId>
            <version>${bamboo.version}</version>
            <scope>provided</scope>
            <exclusions>
                <!-- Ensure no transitive dependency on the AWS SDK from Bamboo -->
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>stax</groupId>
                    <artifactId>stax-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.atlassian.plugin</groupId>
            <artifactId>atlassian-spring-scanner-annotation</artifactId>
            <version>${atlassian.spring.scanner.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.atlassian.plugin</groupId>
            <artifactId>atlassian-spring-scanner-runtime</artifactId>
            <version>${atlassian.spring.scanner.version}</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
            <version>${aws.sdk.version}</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-sts</artifactId>
            <version>${aws.sdk.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-cloudformation</artifactId>
            <version>${aws.sdk.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>${aws.sdk.version}</version>
            <scope>compile</scope>
        </dependency>

        <!-- WIRED TEST RUNNER DEPENDENCIES -->
        <dependency>
            <groupId>com.atlassian.plugins</groupId>
            <artifactId>atlassian-plugins-osgi-testrunner</artifactId>
            <version>${plugin.testrunner.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
            <version>1.1.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.2-atlassian-1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.atlassian.maven.plugins</groupId>
                <artifactId>bamboo-maven-plugin</artifactId>
                <version>${amps.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <productVersion>${bamboo.version}</productVersion>
                    <productDataVersion>${bamboo.data.version}</productDataVersion>
                    <enableQuickReload>true</enableQuickReload>

                    <!-- See here for an explanation of default instructions: -->
                    <!-- https://developer.atlassian.com/docs/advanced-topics/configuration-of-instructions-in-atlassian-plugins -->
                    <instructions>
                        <Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>

                        <!-- Add package to export here -->
                        <Export-Package>
                            com.reedexpo.cloudformation.api,
                        </Export-Package>

                        <!-- Add package import here -->
                        <Import-Package> org.springframework.osgi.*;resolution:="optional", org.eclipse.gemini.blueprint.*;resolution:="optional",
                            <!-- Explicitly forbid AWS related imports -->
                            !com.amazonaws*,
                            *;
                        </Import-Package>

                        <!-- Ensure plugin is spring powered -->
                        <Spring-Context>*</Spring-Context>
                    </instructions>
                </configuration>
            </plugin>

            <plugin>
                <groupId>com.atlassian.plugin</groupId>
                <artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
                <version>${atlassian.spring.scanner.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>atlassian-spring-scanner</goal>
                        </goals>
                        <phase>process-classes</phase>
                    </execution>
                </executions>
                <configuration>
                    <scannedDependencies>
                        <dependency>
                            <groupId>com.atlassian.plugin</groupId>
                            <artifactId>atlassian-spring-scanner-external-jar</artifactId>
                        </dependency>
                    </scannedDependencies>
                    <verbose>false</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Selected output of bamboo log…

2019-05-22 20:34:42,458 WARN [localhost-startStop-1] [ScanDescriptorForHostClassesStage] The plugin 'atlassian-universal-plugin-manager-plugin-2.22.14.jar' uses a package 'org.apache.velocity.tools.generic' that is also exported by the application.  It is highly recommended that the plugin use its own packages.
2019-05-22 20:34:42,690 WARN [localhost-startStop-1] [ScanDescriptorForHostClassesStage] The plugin 'atlassian-universal-plugin-manager-plugin-2.22.14.jar' uses a package 'org.apache.commons.fileupload.servlet' that is also exported by the application.  It is highly recommended that the plugin use its own packages.
2019-05-22 20:34:46,515 WARN [localhost-startStop-1] [GenerateManifestStage] Manifest contains a 'Spring-Context:' header with a timeout, namely '*;timeout:=60'. This can cause problems as the timeout is server specific. Use the header 'Spring-Context: *' in the jar 'pdkinstall-plugin-0.6.jar'.
2019-05-22 20:34:50,108 ERROR [localhost-startStop-1] [OsgiPluginInstalledHelper] Cannot determine required plugins, cannot resolve bundle 'com.reedexpo.cloudformation.cloudFormation'
2019-05-22 20:34:50,108 ERROR [localhost-startStop-1] [OsgiPluginInstalledHelper] Cannot determine required plugins, cannot resolve bundle 'com.reedexpo.cloudformation.cloudFormation-tests'
2019-05-22 20:34:50,167 INFO [localhost-startStop-1] [DefaultOsgiApplicationContextCreator] Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [Atlassian Bamboo Web Resources Plugin (com.atlassian.bamboo.plugins.atlassian-bamboo-plugin-web-resources)]
2019-05-22 20:34:50,181 INFO [localhost-startStop-1] [DefaultOsgiApplicationContextCreator] Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [ActiveObjects Plugin - OSGi Bundle (com.atlassian.activeobjects.activeobjects-plugin)]


2019-05-22 20:35:06,628 ERROR [localhost-startStop-1] [OsgiPlugin] Detected an error (BundleException) enabling the plugin 'com.reedexpo.cloudformation.cloudFormation' : Unresolved constraint in bundle com.reedexpo.cloudformation.cloudFormation [115]: Unable to resolve 115.0: missing requirement [115.0] osgi.wiring.package; (osgi.wiring.package=org.joda.convert).  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
2019-05-22 20:35:06,627 INFO [ThreadPoolAsyncTaskExecutor::Thread 3] [ExtenderConfiguration] Application context successfully refreshed (NonValidatingOsgiBundleXmlApplicationContext(bundle=com.atlassian.plugins.bamboo-project-creation, config=osgibundle:/META-INF/spring/*.xml))
2019-05-22 20:35:06,799 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&requestFactory] matching OSGi filter [(objectClass=com.atlassian.sal.api.net.RequestFactory)]
2019-05-22 20:35:06,799 INFO [ThreadPoolAsyncTaskExecutor::Thread 2] [DependencyServiceManager] Adding OSGi service dependency for importer [&applicationLinkService] matching OSGi filter [(&(objectClass=com.atlassian.applinks.api.ApplicationLinkService)(objectClass=com.atlassian.applinks.api.ApplicationLinkService))]
2019-05-22 20:35:06,799 WARN [localhost-startStop-1] [AbstractPlugin] Unable to enable plugin 'com.reedexpo.cloudformation.cloudFormation'
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&i18nResolver] matching OSGi filter [(objectClass=com.atlassian.sal.api.message.I18nResolver)]
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&localeResolver] matching OSGi filter [(objectClass=com.atlassian.sal.api.message.LocaleResolver)]
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&txTemplate] matching OSGi filter [(objectClass=com.atlassian.sal.api.transaction.TransactionTemplate)]
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&schedulerService] matching OSGi filter [(objectClass=com.atlassian.scheduler.SchedulerService)]
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&executorFactory] matching OSGi filter [(objectClass=com.atlassian.sal.api.executor.ThreadLocalDelegateExecutorFactory)]
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 4] [DependencyServiceManager] Adding OSGi service dependency for importer [&licenseHandler] matching OSGi filter [(objectClass=com.atlassian.sal.api.license.LicenseHandler)]
2019-05-22 20:35:06,831 INFO [ThreadPoolAsyncTaskExecutor::Thread 7] [DependencyServiceManager] Adding OSGi service dependency for importer [&ao] matching OSGi filter [(&(objectClass=com.atlassian.activeobjects.external.ActiveObjects)(objectClass=com.atlassian.activeobjects.external.ActiveObjects))]
2019-05-22 20:35:06,819 INFO [ThreadPoolAsyncTaskExecutor::Thread 6] [ExtenderConfiguration] Application context successfully refreshed (NonValidatingOsgiBundleXmlApplicationContext(bundle=com.atlassian.plugins.remote-link-aggregator-plugin, config=osgibundle:/META-INF/spring/*.xml))
2019-05-22 20:35:06,816 INFO [ThreadPoolAsyncTaskExecutor::Thread 1] [OsgiServiceFactoryBean] Publishing service under classes [{com.atlassian.oauth.serviceprovider.ServiceProviderTokenStore}]
2019-05-22 20:35:06,806 INFO [ThreadPoolAsyncTaskExecutor::Thread 5] [OsgiServiceFactoryBean] Publishing service under classes [{com.atlassian.sal.api.net.NonMarshallingRequestFactory}]
2019-05-22 20:35:06,801 WARN [localhost-startStop-1] [AbstractPlugin] Because of this exception
com.atlassian.plugin.osgi.container.OsgiContainerException: Cannot start plugin: com.reedexpo.cloudformation.cloudFormation
	at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:418)
	at com.atlassian.plugin.impl.AbstractPlugin.enable(AbstractPlugin.java:286)
	at com.atlassian.plugin.manager.PluginEnabler.actualEnable(PluginEnabler.java:130)
	at com.atlassian.plugin.manager.PluginEnabler.enable(PluginEnabler.java:107)
	at com.atlassian.plugin.manager.DefaultPluginManager.enableDependentPlugins(DefaultPluginManager.java:1212)
	at com.atlassian.plugin.manager.DefaultPluginManager.addPlugins(DefaultPluginManager.java:1188)
	at com.atlassian.bamboo.plugin.BambooPluginManager.addPlugins(BambooPluginManager.java:104)
	at com.atlassian.plugin.manager.DefaultPluginManager.earlyStartup(DefaultPluginManager.java:573)
	at com.atlassian.plugin.manager.DefaultPluginManager.init(DefaultPluginManager.java:503)
	at com.atlassian.bamboo.container.BambooContainer.init(BambooContainer.java:213)
	at com.atlassian.bamboo.container.BambooContainer.initialise(BambooContainer.java:200)
	at com.atlassian.bamboo.upgrade.UpgradeLauncher.initialiseBambooContainer(UpgradeLauncher.java:157)
	at com.atlassian.bamboo.upgrade.UpgradeLauncher.upgradeAndStartBamboo(UpgradeLauncher.java:91)
	at com.atlassian.bamboo.upgrade.UpgradeLauncher.contextInitialized(UpgradeLauncher.java:42)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4900)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5363)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:755)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:731)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:973)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1850)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle com.reedexpo.cloudformation.cloudFormation [115]: Unable to resolve 115.0: missing requirement [115.0] osgi.wiring.package; (osgi.wiring.package=org.joda.convert)
	at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
	at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
	at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:399)
	... 26 more
2019-05-22 20:35:06,800 INFO [ThreadPoolAsyncTaskExecutor::Thread 2] [DependencyServiceManager] Adding OSGi service dependency for importer [&helpPathResolver] matching OSGi filter [(&(objectClass=com.atlassian.sal.api.message.HelpPathResolver)(objectClass=com.atlassian.sal.api.message.HelpPathResolver))]
2019-05-22 20:35:07,001 INFO [ThreadPoolAsyncTaskExecutor::Thread 1] [OsgiServiceFactoryBean] Publishing service under classes [{com.atlassian.sal.api.upgrade.PluginUpgradeTask}]
2019-05-22 20:35:06,999 ERROR [localhost-startStop-1] [PluginEnabler] Unable to enable plugin com.reedexpo.cloudformation.cloudFormation
com.atlassian.plugin.osgi.container.OsgiContainerException: Cannot start plugin: com.reedexpo.cloudformation.cloudFormation
	at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:418)
	at com.atlassian.plugin.impl.AbstractPlugin.enable(AbstractPlugin.java:286)
	at com.atlassian.plugin.manager.PluginEnabler.actualEnable(PluginEnabler.java:130)
	at com.atlassian.plugin.manager.PluginEnabler.enable(PluginEnabler.java:107)
	at com.atlassian.plugin.manager.DefaultPluginManager.enableDependentPlugins(DefaultPluginManager.java:1212)
	at com.atlassian.plugin.manager.DefaultPluginManager.addPlugins(DefaultPluginManager.java:1188)
	at com.atlassian.bamboo.plugin.BambooPluginManager.addPlugins(BambooPluginManager.java:104)
	at com.atlassian.plugin.manager.DefaultPluginManager.earlyStartup(DefaultPluginManager.java:573)
	at com.atlassian.plugin.manager.DefaultPluginManager.init(DefaultPluginManager.java:503)
	at com.atlassian.bamboo.container.BambooContainer.init(BambooContainer.java:213)
	at com.atlassian.bamboo.container.BambooContainer.initialise(BambooContainer.java:200)
	at com.atlassian.bamboo.upgrade.UpgradeLauncher.initialiseBambooContainer(UpgradeLauncher.java:157)
	at com.atlassian.bamboo.upgrade.UpgradeLauncher.upgradeAndStartBamboo(UpgradeLauncher.java:91)
	at com.atlassian.bamboo.upgrade.UpgradeLauncher.contextInitialized(UpgradeLauncher.java:42)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4900)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5363)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:755)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:731)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:973)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1850)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle com.reedexpo.cloudformation.cloudFormation [115]: Unable to resolve 115.0: missing requirement [115.0] osgi.wiring.package; (osgi.wiring.package=org.joda.convert)
	at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
	at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
	at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:399)
	... 26 more
2019-05-22 20:35:06,996 INFO [ThreadPoolAsyncTaskExecutor::Thread 5] [OsgiServiceFactoryBean] Publishing service under classes [{com.atlassian.sal.api.search.query.SearchQueryParser}]

This looks indeed like a different/follow up problem previously masked by the AWS SDK related ones, i.e. the missing package changed:

... missing requirement [115.0] osgi.wiring.package; (osgi.wiring.package=org.joda.convert)

I cross checked with our POMs, and found a relevant entry in one:

</Import-Package>
    <!-- NOTE: Current analysis points to org.joda.convert package import detection in bnd resulting 
        from an optional maven import in joda-time, thus not being pulled transitively by maven, i.e. we need to either import it 
        explicitly via maven, or exclude it here. -->
    !org.joda.convert,
    [... snipped ...]
</Import-Package>

Unfortunately, that stems from quite a while ago, and I can’t really say how that ‘Current analysis’ took place. So while it likely will help you overcome this particular hurdle, it does not really help for analyzing similar issues you will likely encounter.

I have never found a comprehensive guide/article on how to ‘correctly’ debug OSGi issues in context of BND tool usage - should you find one, I’d be thankful for a hint!

In other words, I’m not an OSGi expert in any way, just a developer who had to muddle through too many issues like these over the years :confused:

Good question - I’m not 100% sure, but think they refer to the bundle number/id assigned during the resolution process, i.e. in this case your ‘to be resolved’ bundle ended up as number 115, and the part after the dot likely refers to the package desired by your bundle. Either way, in my experience they change from encounter to encounter and do not help much. I assume they would be more relevant if you are writing an OSGi application itself, not a plugin to be installed in one.

I’ll try to follow up with a maybe more helpful summary of my current OSGi debugging heuristics (would likely help me as well next time around), but I’m quite starved on time atm, so again, no promises.

1 Like