2017-11-08 14 views
1

私は初めてAWS DynamoDBを試しています。私はAWS SDKをダウンロードし、Eclipseにインストールしました。 AWSから提供されたJava DynamoDBの "Store and Query"プロジェクトのサンプルを設定しました。私はEclipse上で簡単なJavaアプリケーションとして実行し、問題なく実行しました。新しいSpring-Bootプロジェクトを作成し、アプリケーションをコピーして貼り付け、必要なSpring-Bootパラメータを追加しました。 Spring-Bootバージョンは、main()コードの最初の行にある "java.lang.ClassNotFoundException"で失敗します。 java.lang.ClassNotFoundExceptionは、init()のAmazoneDynamoDBClientBuilderの実行中に発生します。具体的には、init()メソッドのAmazonDynamoDBClientBuilderクラスで失敗します。コードはきれいで、エラーなく構築されます。私はMaven Centralから適切なジャーを選択するのに苦労したと言います。 DynamoDBコードは、最新のjarリリースがあることを非常に気になりました。コードのリストが、私は次のエラーを取得しています、AWS DynamoDBのEclipse Springブートの問題

package com.belcan; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

import java.util.HashMap; 
import java.util.Map; 

import com.amazonaws.AmazonClientException; 
import com.amazonaws.AmazonServiceException; 
import com.amazonaws.auth.profile.ProfileCredentialsProvider; 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; 
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; 
import com.amazonaws.services.dynamodbv2.model.AttributeValue; 
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator; 
import com.amazonaws.services.dynamodbv2.model.Condition; 
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; 
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest; 
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; 
import com.amazonaws.services.dynamodbv2.model.KeyType; 
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; 
import com.amazonaws.services.dynamodbv2.model.PutItemRequest; 
import com.amazonaws.services.dynamodbv2.model.PutItemResult; 
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; 
import com.amazonaws.services.dynamodbv2.model.ScanRequest; 
import com.amazonaws.services.dynamodbv2.model.ScanResult; 
import com.amazonaws.services.dynamodbv2.model.TableDescription; 
import com.amazonaws.services.dynamodbv2.util.TableUtils; 

@SpringBootApplication 
public class DynamoTest1Application { 

    /* 
    * Before running the code: 
    *  Fill in your AWS access credentials in the provided credentials 
    *  file template, and be sure to move the file to the default location 
    *  (C:\\Users\\Stephen\\.aws\\credentials) where the sample code will load the 
    *  credentials from. 
    *  https://console.aws.amazon.com/iam/home?#security_credential 
    * 
    * WARNING: 
    *  To avoid accidental leakage of your credentials, DO NOT keep 
    *  the credentials file in your source directory. 
    */ 

    static AmazonDynamoDB dynamoDB; 

    /** 
    * The only information needed to create a client are security credentials 
    * consisting of the AWS Access Key ID and Secret Access Key. All other 
    * configuration, such as the service endpoints, are performed 
    * automatically. Client parameters, such as proxies, can be specified in an 
    * optional ClientConfiguration object when constructing a client. 
    * 
    * @see com.amazonaws.auth.BasicAWSCredentials 
    * @see com.amazonaws.auth.ProfilesConfigFile 
    * @see com.amazonaws.ClientConfiguration 
    */ 

    private static void init() throws Exception { 
     /* 
     * The ProfileCredentialsProvider will return your [default] 
     * credential profile by reading from the credentials file located at 
     * (C:\\Users\\Stephen\\.aws\\credentials). 
     */ 
     System.out.println("Starting Init()"); 

     ProfileCredentialsProvider credentialsProvider = new ProfileCredentialsProvider(); 

     try { 
      credentialsProvider.getCredentials(); 
     } catch (Exception e) { 
      throw new AmazonClientException(
        "Init()-1: Cannot load the credentials from the credential profiles file. " + 
        "Please make sure that your credentials file is at the correct " + 
        "location (C:\\Users\\Stephen\\.aws\\credentials), and is in valid format.", 
        e); 
     } 

     System.out.println("Init()-1 Complete"); 

     try { 

     /****** Fails Right Here!! Line 86 is ".withCredentials(credentialsProvider)" *****/ 
     dynamoDB = AmazonDynamoDBClientBuilder.standard() 
      .withCredentials(credentialsProvider) 
      .build(); 
     } catch (Exception e) { 
      throw new AmazonClientException(
        "Init()-2: Cannot build client", e); 
     } 

     System.out.println("Init()-2 Complete"); 
    } 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(DynamoTest1Application.class, args); 

     /***** This is line 98 ****/ 
     init(); 

     try { 
      String tableName = "my-favorite-movies-table"; 

      // Create a table with a primary hash key named 'name', which holds a string 
      CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName) 
       .withKeySchema(new KeySchemaElement().withAttributeName("name").withKeyType(KeyType.HASH)) 
       .withAttributeDefinitions(new AttributeDefinition().withAttributeName("name").withAttributeType(ScalarAttributeType.S)) 
       .withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L)); 

      // Create table if it does not exist yet 
      TableUtils.createTableIfNotExists(dynamoDB, createTableRequest); 
      // wait for the table to move into ACTIVE state 
      TableUtils.waitUntilActive(dynamoDB, tableName); 

      // Describe our new table 
      DescribeTableRequest describeTableRequest = new DescribeTableRequest().withTableName(tableName); 
      TableDescription tableDescription = dynamoDB.describeTable(describeTableRequest).getTable(); 
      System.out.println("Table Description: " + tableDescription); 

      // Add an item 
      Map<String, AttributeValue> item = newItem("Bill & Ted's Excellent Adventure", 1989, "****", "James", "Sara"); 
      PutItemRequest putItemRequest = new PutItemRequest(tableName, item); 
      PutItemResult putItemResult = dynamoDB.putItem(putItemRequest); 
      System.out.println("Result: " + putItemResult); 

      // Add another item 
      item = newItem("Airplane", 1980, "*****", "James", "Billy Bob"); 
      putItemRequest = new PutItemRequest(tableName, item); 
      putItemResult = dynamoDB.putItem(putItemRequest); 
      System.out.println("Result: " + putItemResult); 

      // Scan items for movies with a year attribute greater than 1985 
      HashMap<String, Condition> scanFilter = new HashMap<String, Condition>(); 
      Condition condition = new Condition() 
       .withComparisonOperator(ComparisonOperator.GT.toString()) 
       .withAttributeValueList(new AttributeValue().withN("1985")); 
      scanFilter.put("year", condition); 
      ScanRequest scanRequest = new ScanRequest(tableName).withScanFilter(scanFilter); 
      ScanResult scanResult = dynamoDB.scan(scanRequest); 
      System.out.println("Result: " + scanResult); 

     } catch (AmazonServiceException ase) { 
      System.out.println("Caught an AmazonServiceException, which means your request made it " 
        + "to AWS, but was rejected with an error response for some reason."); 
      System.out.println("Error Message: " + ase.getMessage()); 
      System.out.println("HTTP Status Code: " + ase.getStatusCode()); 
      System.out.println("AWS Error Code: " + ase.getErrorCode()); 
      System.out.println("Error Type:  " + ase.getErrorType()); 
      System.out.println("Request ID:  " + ase.getRequestId()); 
     } catch (AmazonClientException ace) { 
      System.out.println("Caught an AmazonClientException, which means the client encountered " 
        + "a serious internal problem while trying to communicate with AWS, " 
        + "such as not being able to access the network."); 
      System.out.println("Error Message: " + ace.getMessage()); 
     } 
    } 

    private static Map<String, AttributeValue> newItem(String name, int year, String rating, String... fans) { 
     Map<String, AttributeValue> item = new HashMap<String, AttributeValue>(); 
     item.put("name", new AttributeValue(name)); 
     item.put("year", new AttributeValue().withN(Integer.toString(year))); 
     item.put("rating", new AttributeValue(rating)); 
     item.put("fans", new AttributeValue().withSS(fans)); 

     return item; 
    } 

} 

を添付し

. ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.5.8.RELEASE) 

2017-11-08 13:44:58.450 INFO 21012 --- [   main] com.belcan.DynamoTest1Application  : Starting DynamoTest1Application on skmi5-7000 with PID 21012 (C:\Users\Stephen\Desktop\BCN\Projects\360Yield\swdev\360yield\360examples\DynamoTest1\bin started by Stephen in C:\Users\Stephen\Desktop\BCN\Projects\360Yield\swdev\360yield\360examples\DynamoTest1) 
2017-11-08 13:44:58.456 INFO 21012 --- [   main] com.belcan.DynamoTest1Application  : No active profile set, falling back to default profiles: default 
2017-11-08 13:44:58.544 INFO 21012 --- [   main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]59717824: startup date [Wed Nov 08 13:44:58 EST 2017]; root of context hierarchy 
2017-11-08 13:44:59.089 INFO 21012 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Registering beans for JMX exposure on startup 
2017-11-08 13:44:59.104 INFO 21012 --- [   main] com.belcan.DynamoTest1Application  : Started DynamoTest1Application in 1.185 seconds (JVM running for 2.316) 
Starting Init() 
Init()-1 Complete 
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 
    at com.amazonaws.internal.config.InternalConfig.<clinit>(InternalConfig.java:43) 
    at com.amazonaws.internal.config.InternalConfig$Factory.<clinit>(InternalConfig.java:304) 
    at com.amazonaws.util.VersionInfoUtils.userAgent(VersionInfoUtils.java:142) 
    at com.amazonaws.util.VersionInfoUtils.initializeUserAgent(VersionInfoUtils.java:137) 
    at com.amazonaws.util.VersionInfoUtils.getUserAgent(VersionInfoUtils.java:100) 
    at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:65) 
    at com.amazonaws.ClientConfigurationFactory.getDefaultConfig(ClientConfigurationFactory.java:46) 
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientConfigurationFactory.getDefaultConfig(AmazonDynamoDBClientConfigurationFactory.java:31) 
    at com.amazonaws.ClientConfigurationFactory.getConfig(ClientConfigurationFactory.java:36) 
    at com.amazonaws.client.builder.AwsClientBuilder.resolveClientConfiguration(AwsClientBuilder.java:163) 
    at com.amazonaws.client.builder.AwsClientBuilder.access$000(AwsClientBuilder.java:52) 
    at com.amazonaws.client.builder.AwsClientBuilder$SyncBuilderParams.<init>(AwsClientBuilder.java:411) 
    at com.amazonaws.client.builder.AwsClientBuilder.getSyncClientParams(AwsClientBuilder.java:354) 
    at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46) 
    at com.belcan.DynamoTest1Application.init(DynamoTest1Application.java:86) 
    at com.belcan.DynamoTest1Application.main(DynamoTest1Application.java:98) 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 16 more 
2017-11-08 13:44:59.130 INFO 21012 --- [  Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.spring[email protected]59717824: startup date [Wed Nov 08 13:44:58 EST 2017]; root of context hierarchy 
2017-11-08 13:44:59.133 INFO 21012 --- [  Thread-2] o.s.j.e.a.AnnotationMBeanExporter  : Unregistering JMX-exposed beans on shutdown 

あなたは本当にエラーを確認するために非常に遠く掘る必要はありません。この失敗は、main()、init()メソッドの最初のコード行で発生します。 あなたは私がどれだけ遠くにいるかを見るためにprintlnのメソッドをメソッドに置くことができます。私はinit()の最初の部分、資格情報の取得を過ぎてしまいます。 init()の2番目の部分、DynamoDBクライアントが構築されているAmazonDynamoDBClientBuilderで失敗しています。瓶で何かファンキーなことが起こっているようです。元のAWS Javaコードはmaven用に書かれています。私はGradle for Spring Bootを使用しています。私はGradleのビルドでこれらの2を含ま

aws-java-sdk-1.11.225 
aws-kinesis-client-1.2.1 

、元AWSのpom.xmlファイルを見て、それが2つの依存関係を参照することがわかりました。私が使用している瓶は以下の通りです。

amazon-kinesis-client-1.8.7.jar 
aws-java-sdk-1.11.225 (1).jar 
aws-java-sdk-core-1.11.226 (1).jar 
aws-java-sdk-dynamodb-1.11.226 (2).jar 

何が起こっているかについてのアイデアはありますか?私は瓶がないか、正しいものを取り付けていないようです。運がないまま2日間作業していました。どんな助けも素晴らしいだろう。

答えて

1

は、あなたのgradle.buildにこれを追加します。

compile("com.fasterxml.jackson.core:jackson-databind:2.9.2") 
+0

これは非常に私の問題を解決しませんでした。上記で強調した依存性AlexGeraを追加しましたが、別のjarに対して別の "ClassNotFoundException"があります。しかし、それは実際の問題に私を啓発した。 AWSは、Spring BootではなくPOJOをサポートしています。 AWSが構築するPOJOプロジェクトには、Eclipse Spring Bootビルドにはないかなり大きなMaven依存関係が含まれています。 Eclipse Gradle Spring Bootプロジェクトでこれらの依存関係をすべて取得する方法を理解する必要があります。 30または40のGradle依存関係を入力することなくこれを簡単に修正する方法を知っている人は誰ですか? – skmansfield

+0

AWSはSpringやPOJO用のサポート・ヘラを提供していません(これはbtwという意味ですか?)。あなたの問題は、正しいビルディングステージに依存する正しいライブラリを追加することだけです。たとえば、元のエラーでDynamoDBの設定がXMLから読み込もうとしていて、マーシャルライブラリが見つかりませんでした。 – AlexGera

+0

「オリジナルのAWS Javaコードはmaven向けに書かれました。私はGradle for Spring Bootを使用しています。 - それは問題ではありません。 MavenやGradle、Ivyのコードを書くことはできませんでした。 Gradleはシーンの下にあるアーティファクトリポジトリとしてMavenを使用します(他に指定されていない場合)。 Gradleはビルドフレームワークであり、Maven – AlexGera

関連する問題