Pax-Exam Test: Class not found problem

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Pax-Exam Test: Class not found problem

Alex Soto
Hi, 

I want to start a Derby Network Embedded Database as part of my PAX-EXAM integration test with Karaf (4.2.0).  No matter what I do, I am always getting this class not found error:

java.lang.ClassNotFoundException: org.apache.derby.iapi.services.property.PropertyUtil not found by wrap_file__Users_asoto_.m2_repository_org_apache_derby_derbynet_10.13.1.1_derbynet-10.13.1.1.jar_overwrite_full [199]

I am deploying all bundles I think I need:

wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derby")
.versionAsInProject().getURL() + "$overwrite=full"),
wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbyclient")
.versionAsInProject().getURL() + "$overwrite=full"),
wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbynet")
.versionAsInProject().getURL() + "$overwrite=full"),
wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbytools")
.versionAsInProject().getURL() + "$overwrite=full"),


Notice I am wrapping all the jars and overriding their manifests to force export-everything, just as a precaution.  I may not need to do this, but since it was not working, I am forcing it.  The error comes from this line of code:

NetworkServerControl server = new NetworkServerControl(InetAddress.getByName("localhost"), 1527);


Karaf starts, normally,  i.e., there are no unresolved bundle errors. Inspect the Karaf directory created by PAX-EXAM, I see the under the data/tmp the various derby jars. The derby.jar is exporting everything including the package in question:

org.apache.derby.iapi.services.property;uses:="org.apache.derby.iapi.error,org.apache.derby.iapi.services.daemon,org.apache.derby.iapi.store.access"


On the other hand, the derbynet.jar has the Import-Package with the aforementioned package:

org.apache.derby.iapi.services.property;resolution:=optional,org.apache.derby.iapi.services.stream;resolution:=optional

If I run Karaf interactively  from the directory created by PAX-EXAM, I can see all the bundles are deployed, and I can find the class in question:

karaf@root()> bundle:find-class org.apache.derby.iapi.services.property.PropertyUtil
Apache Derby 10.13 (197)
org/apache/derby/iapi/services/property/PropertyUtil.class


I’ve checked everything I can think of.  What am I missing?  What could be causing this?

Best regards,
Alex soto




Reply | Threaded
Open this post in threaded view
|

Re: Pax-Exam Test: Class not found problem

Alex Soto
In case it helps others, I found that the reason for the ClassNotFound error is that derby.jar and derbyclient.jar split packages (org.apache.derby.jdbc).  
So I solved the issue by:

1- Start Derby from the POM before integration test:

<plugin>
<groupId>org.carlspring.maven</groupId>
<artifactId>derby-maven-plugin</artifactId>
     <executions>
                    <execution>
<id>start-derby</id>
<phase>integration-test</phase>
<goals>
    <goal>start</goal>
</goals>
<configuration>
<port>1527</port>
</configuration>
</execution>
     </executions>
        </plugin>

2- Deploy derbyclient jar from my integration test:

mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbyclient”)
.versionAsInProject()

3- Configure Pax-Exam probe bundle to resolve derbyclient packages first:

@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
probe.setHeader(Constants.BUNDLE_SYMBOLICNAME, "IT-FlinkJDBC-Probe");
probe.setHeader(Constants.DYNAMICIMPORT_PACKAGE,
"org.apache.derby.jdbc;bundle-symbolic-name=derbyclient,org.apache.felix.service.*;status=provisional,*");
return probe;
}


With this, I can load the derby client driver and connect to the external Derby database:

Class.forName("org.apache.derby.jdbc.ClientDriver”);

even though both derby.jar and derbyclient.jar are deployed, my integration test only resolves the classes from derbyclient.jar.



On Jun 14, 2018, at 4:09 PM, Alex Soto <[hidden email]> wrote:

Hi, 

I want to start a Derby Network Embedded Database as part of my PAX-EXAM integration test with Karaf (4.2.0).  No matter what I do, I am always getting this class not found error:

java.lang.ClassNotFoundException: org.apache.derby.iapi.services.property.PropertyUtil not found by wrap_file__Users_asoto_.m2_repository_org_apache_derby_derbynet_10.13.1.1_derbynet-10.13.1.1.jar_overwrite_full [199]

I am deploying all bundles I think I need:

wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derby")
.versionAsInProject().getURL() + "$overwrite=full"),
wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbyclient")
.versionAsInProject().getURL() + "$overwrite=full"),
wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbynet")
.versionAsInProject().getURL() + "$overwrite=full"),
wrappedBundle(mavenBundle()
.groupId("org.apache.derby")
.artifactId("derbytools")
.versionAsInProject().getURL() + "$overwrite=full"),


Notice I am wrapping all the jars and overriding their manifests to force export-everything, just as a precaution.  I may not need to do this, but since it was not working, I am forcing it.  The error comes from this line of code:

NetworkServerControl server = new NetworkServerControl(InetAddress.getByName("localhost"), 1527);


Karaf starts, normally,  i.e., there are no unresolved bundle errors. Inspect the Karaf directory created by PAX-EXAM, I see the under the data/tmp the various derby jars. The derby.jar is exporting everything including the package in question:

org.apache.derby.iapi.services.property;uses:="org.apache.derby.iapi.error,org.apache.derby.iapi.services.daemon,org.apache.derby.iapi.store.access"


On the other hand, the derbynet.jar has the Import-Package with the aforementioned package:

org.apache.derby.iapi.services.property;resolution:=optional,org.apache.derby.iapi.services.stream;resolution:=optional

If I run Karaf interactively  from the directory created by PAX-EXAM, I can see all the bundles are deployed, and I can find the class in question:

karaf@root()> bundle:find-class org.apache.derby.iapi.services.property.PropertyUtil
Apache Derby 10.13 (197)
org/apache/derby/iapi/services/property/PropertyUtil.class


I’ve checked everything I can think of.  What am I missing?  What could be causing this?

Best regards,
Alex soto