Связывание AWS с Java - экстремальные основы

Я давно не использовал Java, но пытаюсь написать простое приложение Java, использующее API AWS.

Часть, на которой я застрял, заключается в том, что я не могу точно вспомнить, как связать API с кодом Java. Я не использую eclipse и не хочу, мне нравится писать свой код просто возвышенным текстом. Так что мне действительно нужно, чтобы кто-то объяснил мне, как простыми словами все это связать.

Моя файловая иерархия:

  • Project
    • Test.java
    • aws-java-sdk-1.10.5.1.jar
    • aws-java-sdk-1.10.5.1
      • Documentation
      • lib
        • aws-java-sdk-1.10.5.1-javadoc.jar
        • aws-java-sdk-1.10.5.1-sources.jar
        • aws-java-sdk-1.10.5.1.jar
        • aws-java-sdk-flow-build-tools-1.10.5.1.jar
      • образцы
      • третья сторона

Я переместил aws-java-sdk-1.10.5.1.jar из папки lib и поместил его на тот же уровень исходного кода, потому что это то, что, как я думал, мне нужно сделать. Для исходного кода вот пример того, что у меня есть:

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.sns.AmazonSNSClient;

public class Test
{
  public static void main(String args[])
  {
    BasicAWSCredentials cruds = new BasicAWSCredentials("<<ACCESS KEY>>", "<<SECRET KEY>>");
    AmazonSNSClient snsClient = new AmazonSNSClient(cruds);

    System.out.println("Hello World!");
  }
}

В своем терминале я компилирую код с помощью команды:

javac Test.java

однако у меня это не работает, и я получаю сообщение об ошибке error: cannot find symbol. Мне удалось его скомпилировать с помощью следующей команды. (Но я чувствую, что верхняя команда должна работать, если моя иерархия верна?):

javac -cp aws-java-sdk-1.10.5.1.jar Test.java  

После компиляции кода и получения файла класса я пытаюсь запустить свою программу с помощью команды

java Test

но это бросает мне след

Exception in thread "main" java.lang.NoClassDefFoundError: com/amazonaws/auth/AWSCredentials
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getMethod0(Class.java:2937)
at java.lang.Class.getMethod(Class.java:1771)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.amazonaws.auth.AWSCredentials
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more

Я уверен, что это чрезвычайно глупая проблема, и в основном я не могу вспомнить, как ее правильно использовать. Если кто-то может дать мне идиотское руководство о том, как сделать эту работу, я был бы вам очень благодарен!


person srz2    schedule 18.07.2015    source источник
comment
Использование Maven (или Gradle) для управления зависимостями в ваших проектах устранит эти типы проблем. Однако для этого потребуется другая структура папок.   -  person JaredHatfield    schedule 19.07.2015


Ответы (2)


в основном jar должен находиться в пути к классу как при компиляции, так и при запуске.

вы определились с компилирующей частью. для части бега вы делаете что-то подобное:

java -cp aws-java-sdk-1.10.5.1.jar:. Test

Загрузчик классов (надеюсь) будет искать в нужном месте и выбирать классы.

боковой комментарий: если вы занимаетесь разработкой без использования IDE, у вас будут плохие времена, когда java будет делать нетривиальные вещи. импорт и отсутствие автозаполнения убьют вашу скорость разработки. Рекомендуем дать IntelliJ или Eclipse шанс.

боковой комментарий 2: если вы собираетесь заниматься разработкой и собирать окончательные артефакты вручную, вам также придется нелегко с управлением зависимостями. Я рекомендую поискать что-нибудь вроде maven (https://maven.apache.org)

person Mircea    schedule 18.07.2015
comment
Я тоже подумал об этом, и когда я попробовал вашу команду, я получил сообщение об ошибке: Ошибка: не удалось найти или загрузить основной класс Test - person srz2; 18.07.2015
comment
Ошибка: не удалось найти или загрузить тест основного класса - person srz2; 18.07.2015
comment
java -cp aws-java-sdk-1.10.5.1.jar: Test.jar Test? - person Mircea; 18.07.2015
comment
вроде имеет смысл, вам нужны обе банки. другой способ - указать каталог jar - или скопировать jar в специальный каталог артефактов и указать этот каталог - person Mircea; 19.07.2015
comment
у вас есть Test.jar в результате компиляции? - person Mircea; 19.07.2015
comment
Нет, я только что получил файл .class, я пока не пытаюсь распространять программу - person srz2; 19.07.2015
comment
ха хорошо, это имеет смысл. попробуйте упаковать класс в банку с помощью команды jar и после этого нажать обе или сделать это, как предлагается в ответе: java -cp aws-java-sdk-1.10.5.1.jar :. Тестовое задание - person Mircea; 19.07.2015

Используйте Maven и установите зависимости POM. Например, если вы используете Java IDE, такую ​​как IntelliJ, выполните следующие задачи:

  1. В IntelliJ IDE выберите File, New, Project.
  2. В диалоговом окне «Новый проект» выберите Maven.
  3. Выберите "Далее".
  4. В GroupId введите aws-project.
  5. В ArtifactId введите aws-project.
  6. Выберите "Далее".
  7. Выберите Готово.

Примечание. Добавьте файл POM, который вы найдете в папке для конкретной службы, в файл POM в проекте. Затем создайте пакет, который вы найдете в примерах, и можете начать добавлять классы Java в свой проект.

Это намного проще, чем пытаться найти файлы JAR и включить их в свой путь к классу.

person smac2020    schedule 14.09.2020