2013-11-29 2 views
0

Я пытаюсь сделать приложение JavaFX, которое может принимать параметры командной строки. Я могу получить параметры. Но у меня возникают проблемы, когда я внедряю класс «А» (из Main.java), в котором есть члены Selenium (Testing/WebBrowser Automation Library).NoClassDefFoundError в JavaFx с параметрами командной строки с кодом Selenium?

// Main.java 
package myPackage; 

import java.util.Map; 
import javafx.application.Application; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage stage) { 
     if (getParameters().getRaw().isEmpty() == false) { 
      System.out.println("The application was called by Command Line."); 
      Map<String, String> params = getParameters().getNamed(); 
      System.out.println(params.get("a"));    
      A myA = new A(); 
     } else { 
      System.out.println("The application was called executing the jar file."); 
      A myA = new A(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

// A.java 
package myPackage; 

import org.openqa.selenium.By; 
import org.openqa.selenium.NoSuchElementException; 
import org.openqa.selenium.chrome.ChromeDriver; 

public class A { 

    ChromeDriver driver; 

    A() { 
     System.out.println("New A Instance."); 
     System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe"); 
     this.driver = new ChromeDriver(); 
    } 

    public boolean isElementPresent(By by) { 
     try { 
      this.driver.findElement(by); 
      return true; 
     } catch (NoSuchElementException ex) { 
      return false; 
     } 
    } 
} 

Но когда я пытаюсь выполнить его:java -cp MyProject.jar myPackage.Main --a="value1"

The application was called by Command Line. 
value1 
Exception in Application start method 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367) 
     at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894) 
     at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56) 
     at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158) 
     at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.NoClassDefFoundError: org/openqa/selenium/NoSuchElementException 
     at myPackage.Main.start(Main.java:16) 
     at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837) 
     at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:331) 
     at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:297) 
     at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:294) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:294) 
     at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
     at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 
     at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) 
     ... 1 more 
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.NoSuchElementException 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:359) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:348) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:347) 
     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) 
     ... 12 more 
Exception running application myPackage.Main 

Как вы можете видеть, приложение получить параметр и выводит его на экран (первая и вторая линия в этом выводе выше) ...

Я прочитал эту строку NoClassDefFoundError: org/openqa/selenium/NoSuchElementException, но s добавлена ​​библиотека elenium (2.37.0), а также зависимости libs. В Netbeans на вкладке Libraries > Compile

Если я запустил приложение с помощью Netbeans Project properties > run > parameters и вставив один параметр, все в порядке. Проблема возникает, когда я делаю то же самое с помощью командной строки ...

Я пробовал много вещей ... и я не понимаю, почему?

+1

Возможно, вам необходимо добавить библиотеку к пути к классам при выполнении приложения. То, что вы делаете в Netbeans, вступает в силу при запуске из Netbeans. –

ответ

0

@KnutArneVedaa Спасибо за комментарий выше. Я программист PHP и почти ничего не знаю о Java. Но ваше понимание прояснило меня, что CLASSPATH похож на PATH на PHP, просто переменную окружения, и это помогло мне решить мою проблему.

Я просто явным образом определяю каталог пути к моей текущей директории (каталог проекта), так как '.' Значение по умолчанию, не является обязательным, а затем я использую -jar флага, чтобы указать файл банк лол ...

java -cp '.' -jar MyProject.jar myPackage.Main --a="value1"

Это работает! Передача параметров и моментальное восстановление ChromeDriver.

Еще раз спасибо;)

Смежные вопросы