簡體   English   中英

JavaFx中的NoClassDefFoundError,帶有帶有硒代碼的命令行參數?

[英]NoClassDefFoundError in JavaFx with Command line Parameters with Selenium Code?

我正在嘗試做一個可以接收命令行參數的JavaFX應用程序。 我可以接收參數。 但是,當我實例化具有內部Selenium(測試/ WebBrowser自動化庫)成員的“ A”類(來自Main.java)時,我遇到了問題。

// 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但是添加了硒庫(2.37.0),並且庫依賴也是如此。 在Netbeans的“ Libraries > Compile選項卡中

如果我使用Netbeans Project properties > run > parameters來運行該應用程序,然后插入一個參數,那一切都很好。 問題出在我通過命令行執行相同操作時...

我已經嘗試了很多東西...但我不明白,為什么?

@KnutArneVedaa感謝您的評論。 我是PHP程序員,對Java幾乎一無所知。 但是您的見解告訴我,CLASSPATH就像PHP中的PATH一樣,只是一個環境變量,這幫助我解決了我的問題。

我只是明確地將類路徑目錄定義為當前目錄(項目目錄),因為“。”。 是默認值,是可選的,然后我使用-jar標志指定jar文件大聲笑...

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

有用! 傳遞參數和ChromeDriver實例化。

再次感謝你 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM