Integration tests mysteriously fail if DynamoDb Local is added as a maven repo

696 views
Skip to first unread message

Ali Akhtar

unread,
Mar 31, 2016, 8:55:49 AM3/31/16
to dropwizard-dev
Enter code here...

Enter code here...

I'm trying to run integration tests w/ Dropwizard, here's the base class:

public abstract class IntegrationTest
{
    @ClassRule
    public static DropwizardAppRule<MyConfiguration> APP =
            new DropwizardAppRule<>(MyApplication.class, resourceFilePath("test.json"));


    private final Logger log = Logging.get(this);


    protected final Client client = ClientBuilder.newClient();

    private String url(String path)
    {
        return "http://localhost:" + APP.getLocalPort() + path;
    }


    protected Response post(String path, Object entity)
    {
        return client.target(url(path)).request().buildPost(Entity.json(entity)).invoke();
    }


    protected Response get(String path)
    {
        return client.target( url(path) ).request().buildGet().invoke();
    }
}

If I add the following maven dependency:
          
       
        <dependency>
             <groupId>com.amazonaws</groupId>
            <artifactId>DynamoDBLocal</artifactId>
            <version>1.10.5.1</version>
        </dependency>


<repositories>
        <repository>
            <id>dynamodblocal</id>
            <name>AWS DynamoDB Local Release Repository</name>
            <url>http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release</url>
        </repository>
    </repositories>




Then I get the following stack trace when I try to run a test:

java.lang.NoClassDefFoundError: org/eclipse/jetty/util/component/AggregateLifeCycle
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.dropwizard.Configuration.<init>(Configuration.java:63)
at com.my.web.MyConfiguration.<init>(MyConfiguration.java:7)
at com.my.web.MyConfiguration$Creator4JacksonDeserializer37e9eb1b.createUsingDefault(com/my/web/MyConfiguration$Creator4JacksonDeserializer.java)
at com.fasterxml.jackson.module.afterburner.deser.SuperSonicBeanDeserializer.deserialize(SuperSonicBeanDeserializer.java:133)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3674)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1996)
at io.dropwizard.configuration.ConfigurationFactory.build(ConfigurationFactory.java:148)
at io.dropwizard.configuration.ConfigurationFactory.build(ConfigurationFactory.java:95)
at io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:115)
at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:64)
at io.dropwizard.testing.DropwizardTestSupport.startIfRequired(DropwizardTestSupport.java:212)
at io.dropwizard.testing.DropwizardTestSupport.before(DropwizardTestSupport.java:115)
at io.dropwizard.testing.junit.DropwizardAppRule.before(DropwizardAppRule.java:87)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.util.component.AggregateLifeCycle
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 73 more

MyConfiguration.java:


public class MyConfiguration extends Configuration
{
   
private AwsConfig awsConfig = new AwsConfig();
   
private Mode mode = Mode.DEV; //MODE = Enum { DEV, TEST, PROD }


   
@JsonProperty("aws")
   
public AwsConfig getAwsConfig()
   
{
       
return awsConfig;
   
}


   
@JsonProperty("aws")
   
public void setAwsConfig(AwsConfig awsConfig)
   
{
       
this.awsConfig = awsConfig;
   
}


   
@JsonProperty("mode")
   
public Mode getMode()
   
{
       
return mode;
   
}


   
@JsonProperty("mode")
   
public void setMode(Mode mode)
   
{
       
this.mode = mode;
   
}


   
public class AwsConfig
   
{
       
private String accessKey;
       
private String secret;


       
@JsonProperty
       
public String getAccessKey()
       
{
           
return accessKey;
       
}


       
@JsonProperty
       
public void setAccessKey(String accessKey)
       
{
           
this.accessKey = accessKey;
       
}


       
@JsonProperty
       
public String getSecret()
       
{
           
return secret;
       
}


       
@JsonProperty
       
public void setSecret(String secret)
       
{
           
this.secret = secret;
       
}


       
@Override
       
public String toString()
       
{
           
return "AwsConfig{" +
                   
"accessKey='" + accessKey + '\'' +
                   
", secret='" + secret + '\'' +
                   
'}';
       
}
   
}
}


Everything works if I just take out the dynamodb dependency. Any ideas what's going on?

Tim Altmann

unread,
Mar 31, 2016, 11:59:19 AM3/31/16
to dropwizard-dev
DynamoDBLocal has a transitive dependency to org.eclipse.jetty:jetty-server:8.1.12.v20130726

Dropwizard 1.0.0-rc3 requires jetty.version = 9.3.8.v20160314 (dropwizard-bom)

Your classloader is likely pulling in the older version when you include DynamoDBLocal.  You'll probably have to exclude the old version (try: https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html) and then test to see if DynamoDBLocal still works with the newer jetty server.

Ali Akhtar

unread,
Mar 31, 2016, 12:53:18 PM3/31/16
to dropwizard-dev
Thanks a bunch.

Tried that, and I'm now getting a different stack trace:


java
.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpPatch
 at com
.amazonaws.http.AmazonHttpClient.<clinit>(AmazonHttpClient.java:143)
 at com
.amazonaws.AmazonWebServiceClient.<init>(AmazonWebServiceClient.java:136)
 at com
.amazonaws.AmazonWebServiceClient.<init>(AmazonWebServiceClient.java:120)
 at com
.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.<init>(AmazonDynamoDBClient.java:319)
 at com
.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.<init>(AmazonDynamoDBClient.java:298)
 at com
.my.web.MyApplication.run(MyApplication.java:39)
 at com
.my.web.MyApplication.run(MyApplication.java:15)
 at io
.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:40)
 at io
.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:77)

 at io
.dropwizard.testing.DropwizardTestSupport.startIfRequired(DropwizardTestSupport.java:212)
 at io
.dropwizard.testing.DropwizardTestSupport.before(DropwizardTestSupport.java:115)
 at io
.dropwizard.testing.junit.DropwizardAppRule.before(DropwizardAppRule.java:87)
 at org
.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
 at org
.junit.rules.RunRules.evaluate(RunRules.java:20)
 at org
.junit.runners.ParentRunner.run(ParentRunner.java:363)
 at org
.junit.runner.JUnitCore.run(JUnitCore.java:137)
 at com
.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
 at com
.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
 at com
.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
 at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at com
.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpPatch

 at java
.net.URLClassLoader.findClass(URLClassLoader.java:381)
 at java
.lang.ClassLoader.loadClass(ClassLoader.java:424)
 at sun
.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
 at java
.lang.ClassLoader.loadClass(ClassLoader.java:357)

 
... 24 more

Looking at the dependencies, I can't find any for apache http for DynamoDBLocal, though it does have one for apache commons-lang3 and commons-cli. Any ideas on which other deps I need to exclude?

Ali Akhtar

unread,
Mar 31, 2016, 1:21:12 PM3/31/16
to dropwizard-dev
Adding this:

           
<dependency>
               
<groupId>org.apache.httpcomponents</groupId>
               
<artifactId>httpclient</artifactId>
               
<version>4.5.2</version>
           
</dependency>

to the dependency management fixed this. Thanks for the pointer along the right direction!
...
Reply all
Reply to author
Forward
0 new messages