Java или JavaC говорят, что пакет не найден или не существует - PullRequest
0 голосов
/ 08 ноября 2018

Я попадаюсь в ловушку при попытке запустить файл Java внутри проекта Maven. Я настроил его, где я запускаю Java-класс, который выполняет некоторые настройки перед использованием exec для запуска остальных тестов в Maven. Я могу нормально запустить программу внутри инструмента IDE (Eclipse), но когда я запускаю Программу из CMD или Git Bash, я получаю сообщения об ошибках, указывающих на то, что ClassDef не найден или пакет / импорт не существует (даже если он отлично работает в IDE и на командах Mvn для тестирования классов. Я пытался использовать Javac - ср., чтобы увидеть, избавит ли новая установка от ошибок, но я получаю похожие ошибки. Я искал несколько разных ответов, они либо не не могу решить проблему или перевести мой проект в гораздо худшее состояние. Теперь я не уверен, какова точная причина проблемы, и определяю лучшее решение для ее устранения.

Вот пример моей проблемы, я пытаюсь скомпилировать один из Java-файлов, который связан с Java-файлом, который я хочу запустить, который запустит Maven:

 $ javac -d build/classes -sourcepath src -cp target/classes src/AppiumDriverSetUp_Lib/XMLMaker.java
src\AppiumDriverSetUp_Lib\XMLMaker.java:28: error: package io.appium.java_client does not exist
import io.appium.java_client.AppiumDriver;
                            ^
src\AppiumDriverSetUp_Lib\XMLMaker.java:29: error: package io.appium.java_client does not exist
import io.appium.java_client.MobileElement;
                            ^
src\AppiumDriverSetUp_Lib\XMLMaker.java:49: error: cannot find symbol
        public void setupDriverXMLFile(List <AppiumDriver<MobileElement>> driverList) {
                                             ^
  symbol:   class AppiumDriver
  location: class XMLMaker
src\AppiumDriverSetUp_Lib\XMLMaker.java:49: error: cannot find symbol
        public void setupDriverXMLFile(List <AppiumDriver<MobileElement>> driverList) {
                                                          ^
  symbol:   class MobileElement
  location: class XMLMaker
src\AppiumDriverSetUp_Lib\XMLMaker.java:67: error: cannot find symbol
                        for(AppiumDriver<MobileElement> driver: driverList) {
                            ^
  symbol:   class AppiumDriver
  location: class XMLMaker
src\AppiumDriverSetUp_Lib\XMLMaker.java:67: error: cannot find symbol
                        for(AppiumDriver<MobileElement> driver: driverList) {
                                         ^
  symbol:   class MobileElement
  location: class XMLMaker
6 errors

Файл XMLMaker в пакете AppiumDriverSetUp_Lib:

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;

public class XMLMaker {



    public DocumentBuilderFactory docDriverSetup;

    public DocumentBuilder driverSetup;

    public int connectedDevices = 0;

    public Document doc;


    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    Transformer transformer;


    public void setupDriverXMLFile(List <AppiumDriver<MobileElement>> driverList) {

        System.out.println("List size: "+ driverList.size());
        try {

            docDriverSetup = DocumentBuilderFactory.newInstance();

            driverSetup = docDriverSetup.newDocumentBuilder();

            doc = driverSetup.newDocument();

            transformer = transformerFactory.newTransformer();

            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://testng.org/testng-1.0.dtd");

            Element suiteElement = doc.createElement("suite");
            suiteElement.setAttribute("name", "All-tests");

            for(AppiumDriver<MobileElement> driver: driverList) {

                Element rootElement = doc.createElement("test");
                suiteElement.appendChild(rootElement);
                rootElement.setAttribute("name", (String) driver.getCapabilities().getCapability("deviceId"));

                Element deviceNameEle = doc.createElement("parameter");
                deviceNameEle.setAttribute("name", "deviceName");
                deviceNameEle.setAttribute("value", (String) driver.getCapabilities().getCapability("deviceId"));
                rootElement.appendChild(deviceNameEle);

                Element platformEle = doc.createElement("parameter");
                platformEle.setAttribute("name", "platform");
                platformEle.setAttribute("value", driver.getPlatformName()+"");
                rootElement.appendChild(platformEle);

                Element udidEle = doc.createElement("parameter");
                udidEle.setAttribute("name", "udid");
                udidEle.setAttribute("value", (String)driver.getCapabilities().getCapability("udid"));
                rootElement.appendChild(udidEle);

                Element urlPort = doc.createElement("parameter");
                urlPort.setAttribute("name", "URL");
                urlPort.setAttribute("value", (String)driver.getCapabilities().getCapability("appiumURL"));
                rootElement.appendChild(urlPort);

                Element devicePort = doc.createElement("parameter");

                if((driver.getPlatformName()+"").
                        toLowerCase().contains("android")) {
                        devicePort.setAttribute("name", "port");
                        devicePort.setAttribute("value", driver.getCapabilities().getCapability("systemPort")+"");

                }
                if ((driver.getPlatformName()+"").
                        toLowerCase().contains("ios")) {
                        devicePort.setAttribute("name", "port");
                        devicePort.setAttribute("value", (String)driver.getCapabilities().getCapability("wdaLocalPort"));
                }

                rootElement.appendChild(devicePort);

                Element packages = doc.createElement("packages");
                rootElement.appendChild(packages);
                Element packageName = doc.createElement("package");
                packageName.setAttribute("name", "BaseTest");
                packages.appendChild(packageName);


                connectedDevices++;
            }   
            suiteElement.setAttribute("parallel", "tests");
            suiteElement.setAttribute("thread-count", connectedDevices+"");
            doc.appendChild(suiteElement);

        } catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } 

    }


    public void createDriverFile() throws TransformerConfigurationException, InterruptedException, IOException {

        DOMSource source = new DOMSource(doc);

        FileOutputStream streamNewFile = new FileOutputStream("./drivers.xml");
        PrintWriter pw = new PrintWriter(streamNewFile);
        StreamResult result = new StreamResult(pw);


        try {

            transformer.transform(source, result);
            result.getWriter().close();

            System.out.println("File Updated");



        } catch (TransformerException e) {
            e.printStackTrace();
            System.out.println("Error updating the file");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Unable to close output stream");
        }

    }

}

И вот проблема, когда я пытаюсь скомпилировать файл Java для запуска теста:

$ javac -d build/classes -sourcepath src -cp target/classes src/BaseTest/DriverTest.java
src\BaseTest\DriverTest.java:29: error: cannot access AppiumDriver
                makeFile.setupDriverXMLFile(createDrivers.getActiveList());
                        ^
  class file for io.appium.java_client.AppiumDriver not found
1 error

DriverTest в пакете BaseTest:

import AppiumDriverSetUp_Lib.AppiumDriverSetup;
import AppiumDriverSetUp_Lib.XMLMaker;

public class DriverTest {

    public AppiumDriverSetup createDrivers = new AppiumDriverSetup();

    public XMLMaker makeFile = new XMLMaker();

    public static void main(String [] args) throws TransformerConfigurationException, IOException, InterruptedException {
        System.out.println("Setting up drivers:");

        DriverTest startTest = new DriverTest();
        startTest.driverFileSetup();
        startTest.runSuite();
    }

    public void driverFileSetup() throws IOException, TransformerConfigurationException, InterruptedException {
        createDrivers.makeList();
        makeFile.setupDriverXMLFile(createDrivers.getActiveList());
        makeFile.createDriverFile();
    }

    public void runSuite() throws IOException, InterruptedException {
        Runtime rt = Runtime.getRuntime();
        String cmd = "cmd /c mvn test -Dplat="+System.getProperty("plat");
        Process p = rt.exec(cmd);
        InputStream input = p.getInputStream();
        testFeed(input, System.out);
        p.waitFor();
    }

    public void testFeed(InputStream in, OutputStream out) throws IOException {
        while (true) {
            int c = in.read();
            if (c == -1) {
                break;
            }
            out.write((char)c);
        }
    }

}

В моем классе XMLMaker он уже имеет правильный импорт для AppiumDriver и MobileElement, как один из правильных вариантов импорта в моей IDE. И не проблема, если я запускаю его с mvn. Я думаю, что проблема связана с зависимостями, которые у меня есть для этого проекта. Кто-нибудь сталкивался с таким случаем?

1 Ответ

0 голосов
/ 09 ноября 2018

Похоже, что то, что вы делаете в командной строке, не совсем включает в себя классы, необходимые для его построения. В Eclipse вы, вероятно, имеете ссылку на необходимые файлы JAR.

Мой совет - если вы используете Maven для достижения автоматизации сборки (что вам следует), ее следует использовать полностью, когда процесс сборки сделает все это за вас автоматически.

В вашем случае, я думаю, просто убедитесь, что javac знает, где найти файлы jar для XMLMaker, и можно найти необходимые зависимости.

...