Я пишу небольшое приложение Java, которое запускается локально, но порождает экземпляры EC2. Класс, который я пытаюсь запустить, - Manager
, который я обернул в JAR
, используя файл манифеста, который указывает точку входа кода (Manager.main()
), а затем компилирует «Артефакт» с IntelliJ.Связанные JAR работают отлично в IntelliJ, но не в командной строке
При запуске метод из IntelliJ все работает отлично, но при попытке запустить его в экземпляр EC2 (по отношению ssh
), я получаю следующее сообщение об ошибке:
[[email protected] ~]$ java -cp . -jar Manager.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/amazonaws/AmazonServiceException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.amazonaws.AmazonServiceException
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)
... 7 more
Я также попытался вручную установить CLASSPATH
переменная окружения текущего рабочего каталога (/home/ec2-user
), но это по сути дает тот же результат (обратите внимание, что на этот раз я специально не указываем путь класса с помощью команды выполнения):
[[email protected] ~]$ java -jar Manager.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/amazonaws/AmazonServiceException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.amazonaws.AmazonServiceException
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)
... 7 more
Имейте в виду, что нет никаких учетных данных, я проверил это, запустив класс локально (я использую роли IAM).
Понятно, что ошибка вызвана тем, что необходимые классы из внешнего JAR
s не найдены во время загрузки и настройки программы из командной строки и что IntelliJ выполняет некоторые закулисные mumbo- что я не знаю.
Просто, чтобы сделать программу проточного приложения разъясняя:
- Локальный класс запускается
- Локальный класс нерестится один экземпляр EC2 для класса менеджера
- Менеджер класса нерестится несколько экземпляров EC2 для которые проводят некоторый анализ информации и сообщают о результатах в Менеджере через очереди SQS.
... и если это имеет какое-либо значение, моя локальная машина использует Java 1.8.65, а экземпляр EC2 использует Java 1.8.73.
Ну, даже если я поместил все внешние JAR в ту же папку, что и Manager.class, когда я пытаюсь выполнить ее через 'java -cp. Manager', я все равно получаю ту же ошибку. – asafc
Прочтите мой ответ. Файлы jar должны находиться в пути к классам. Не каталог, содержащий файлы jar. Итак, у вас должно быть что-то вроде 'java -cp.: ./ file1.jar: ./ file2.jar Manager' –
Если да, то почему вы начинаете спецификацию cp с помощью точки? – asafc