2016-04-02 5 views
0

Я пишу небольшое приложение 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- что я не знаю.

Просто, чтобы сделать программу проточного приложения разъясняя:

  1. Локальный класс запускается
  2. Локальный класс нерестится один экземпляр EC2 для класса менеджера
  3. Менеджер класса нерестится несколько экземпляров EC2 для которые проводят некоторый анализ информации и сообщают о результатах в Менеджере через очереди SQS.

... и если это имеет какое-либо значение, моя локальная машина использует Java 1.8.65, а экземпляр EC2 использует Java 1.8.73.

ответ

1

-cp и -jar не должны использоваться вместе.

Либо вы используете -jar, и основной класс, и путь к классам должны быть указаны в манифесте jar, или вы используете -cp, и вам нужно указать путь к классам и имя основного класса.

Путь к классам должны содержать пути к банку самих файлов, а не путь к каталогу, содержащий файлы банка:

java -cp ./file1.jar:./file2.jar com.foo.bar.MainClass 

Опираясь на глобальной переменной CLASSPATH среды всегда плохая идея. Не делай этого.

+0

Ну, даже если я поместил все внешние JAR в ту же папку, что и Manager.class, когда я пытаюсь выполнить ее через 'java -cp. Manager', я все равно получаю ту же ошибку. – asafc

+0

Прочтите мой ответ. Файлы jar должны находиться в пути к классам. Не каталог, содержащий файлы jar. Итак, у вас должно быть что-то вроде 'java -cp.: ./ file1.jar: ./ file2.jar Manager' –

+0

Если да, то почему вы начинаете спецификацию cp с помощью точки? – asafc