как создать исполняемый файл jar, который может выполнять методы из других классов Java в том же пакете

#java

#java

Вопрос:

Изображение структуры папок: структура папок моего проекта

Я пытаюсь создать исполняемый файл jar из eclipse.. У меня есть 3 класса в пакете Java, в котором один класс является основным классом, а другие 2 класса содержат некоторые методы, которые есть в основном классе. Я проверил онлайн и создал файл jar, но он не выполняет вывод из других методов класса.. насколько я знаю, я запустил то же самое в eclipse, и он выдает результат, но когда я запускаю его из исполняемого файла jar, он не выполняет методы других классов. итак, может ли кто-нибудь, пожалуйста, помочь мне создать файл jar.

Я создал файл jar, выполнив шаги на этом сайте
https://www.java67.com/2014/04/how-to-make-executable-jar-file-in-Java-Eclipse.html

Изображение пользовательского интерфейса

когда пользователь нажимает на кнопку Generate, он запускает выполнение метода, который находится в том же классе, и внутри этого метода я вызываю метод другого класса.

Метод

 public static String generateOutput(String url, String tagName) {
        XpathUITest output = new XpathUITest();

        try {
            return output.xpathBuilder(url, tagName);
        } catch (IOException | InterruptedException e) {
            return "Failed with exceotion, please try again";
        }
    }
 

Сгенерировать код выполнения кнопки

 bj.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                
                JLabel j = null;
                url = userInput.getText();
                if(!url.startsWith("http") || !url.startsWith("https")){
                    url="";
                }
                locType = combo.getSelectedItem().toString();
                tagName = comboTags.getSelectedItem().toString();
                boolean executeOutput = false;
                JPanel output = new JPanel(new BorderLayout(4, 4));
                output.setPreferredSize(new DimensionUIResource(500, 350));
                JPanel resOpJP = new JPanel(new GridLayout(0, 1, 4, 4));
                resOpJP.add(new JLabel("Output : ", SwingConstants.LEFT));
                JButton downLoad = new JButton("Download in file");

                JPanel Message = new JPanel();
                if (url.isEmpty()
                        amp;amp; (selectedFile != null amp;amp; selectedFile.endsWith(".html") amp;amp; !selectedFile.isEmpty())) {
                    j = new JLabel("Selected File/URL is "   selectedFile, SwingConstants.RIGHT);
                    inputPath = selectedFile;
                    executeOutput = true;
                } else if ((url.startsWith("http") || url.startsWith("https"))
                        amp;amp; (selectedFile == null || selectedFile.isEmpty())) {
                    j = new JLabel("Selected File/URL is "   url, SwingConstants.RIGHT);
                    inputPath = url;
                    executeOutput = true;
                } else if ((url==null ||url.isEmpty()) amp;amp; (selectedFile == null || selectedFile.isEmpty())) {
                    JOptionPane.showMessageDialog(Message, "Please provide a valid html file / provide a URL", "Error",
                            JOptionPane.ERROR_MESSAGE);
                } else if (selectedFile != null amp;amp; !selectedFile.isEmpty()) {
                    if (selectedFile.contains("html") amp;amp; !(new File(selectedFile).exists())) {
                        JOptionPane.showMessageDialog(Message, "Please provide a valid html file path", "Error",
                                JOptionPane.ERROR_MESSAGE);
                        selectedFile = "";
                    } else if (!selectedFile.endsWith(".html") amp;amp; (new File(selectedFile).exists())) {
                        JOptionPane.showMessageDialog(Message, "Please provide a valid html file", "Error",
                                JOptionPane.ERROR_MESSAGE);
                        selectedFile = "";
                    }
                } else if (!url.isEmpty() amp;amp; (!url.startsWith("http") || !url.startsWith("https"))) {
                    JOptionPane.showMessageDialog(Message, "Please provide a valid URL", "Error",
                            JOptionPane.ERROR_MESSAGE);
                }

                if (locType.contains("Select Locator") || tagName.contains("Select Tag")) {
                    executeOutput = false;
                    JOptionPane.showMessageDialog(Message, "Locator Type and Tag is mandatory", "Error",
                            JOptionPane.ERROR_MESSAGE);
                } else if (!locType.contains("Select Locator") amp;amp; !tagName.contains("Select Tag")) {
                    executeOutput = true;
                }
                if (executeOutput) {

    ///*****This is the step where other class method invoke***///
                    xpathUI.expectedOutput = generateOutput(inputPath, tagName);
                    if (xpathUI.expectedOutput.equals("No html tag found in the provided html")) {
                        JOptionPane.showMessageDialog(new JPanel(), xpathUI.expectedOutput, "Information",
                                JOptionPane.WARNING_MESSAGE);
                    } else if(xpathUI.expectedOutput.contains("Error")){
                        JOptionPane.showMessageDialog(new JPanel(), xpathUI.expectedOutput, "Error Message",
                                JOptionPane.ERROR_MESSAGE);
                    }else {
                    downLoad.addActionListener(new ActionListener() {

                        @SuppressWarnings("null")
                        @Override
                        public void actionPerformed(ActionEvent e) {
                                JFrame jF = new JFrame();
                                jF.setSize(300, 300);
                                choose = new JFileChooser();
                                choose.showSaveDialog(jF);
                                choose.setCurrentDirectory(new File(System.getProperty("user.home")));
                                choose.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                                try {
                                    String saveFile = "";
                                    try {
                                        saveFile = choose.getSelectedFile().getAbsolutePath();
                                        System.out.println(saveFile);
                                    } catch (Exception ex) {
                                        saveFile = "";
                                    }

                                    if ((saveFile != null || !saveFile.isEmpty())
                                            amp;amp; !saveFile.split(".txt")[0].isEmpty()) {
                                        FileOutputStream fout = new FileOutputStream(new File(saveFile));
                                        fout.write(xpathUI.expectedOutput.getBytes());
                                        fout.flush();
                                        fout.close();
                                        if (new File(saveFile).exists()) {
                                            JOptionPane.showMessageDialog(new JPanel(),
                                                    "Locator file saved successfully at :n"   saveFile,
                                                    "Confirmation Message", JOptionPane.INFORMATION_MESSAGE);
                                        }
                                    }

                                } catch (IOException e1) {
                                    e1.printStackTrace();
                                }
                            }
                    });

                    j.setFont(new FontUIResource("Arial", Font.PLAIN, 10));
                    resOpJP.add(j);
                    output.add(resOpJP, BorderLayout.LINE_START);
                    JPanel text = new JPanel(new GridLayout(0, 1));
                    JTextArea jta = new JTextArea();
                    jta.setText("");
                    jta.setText(xpathUI.expectedOutput);
                    jta.setLineWrap(true);
                    jta.setRows(15);
                    jta.setColumns(1);
                    text.add(jta);
                    output.add(text, BorderLayout.PAGE_END);
                    JOptionPane.showOptionDialog(null, output, "XPATH Generator : Output", JOptionPane.DEFAULT_OPTION,
                            JOptionPane.INFORMATION_MESSAGE, null, new Object[] { downLoad }, null);
                }
            }
        }
    });
 

Комментарии:

1. Привет и добро пожаловать. Можете ли вы поделиться своим кодом? Как вы запустили исполняемый файл jar? Покажите пример того, как вы его выполнили, и какой результат был получен из этого, а также из Eclipse.

2. Вы получаете какую-то ошибку, связанную с Main() не найдено. Вызывается ли ваш main(), и вы получаете ClassNotFoundException для других 2 классов. Если проблема с main(), попробуйте это — java -cp MyJar.jar com.mycomp.myproj.classwithmainметод

3. @DarkMatter, я обновил свой вопрос изображением и кодом … для вашего удобства я добавил комментарий в коде, где этот метод начнет выполняться…

4. @PrateekPande, поскольку я новичок в этом, я не знаю, как просмотреть журналы выполнения jar .. можете ли вы помочь мне получить журналы выполнения jar…

5. Да, наконец, когда я запустил его из cmd .. я получил журнал выполнения, и он не получает зависимостей для класса .. для этого требуется JSoup, и выполнение завершается сбоем с NoClassDefFoundError:org/jsoup/Jsoup

Ответ №1:

Я обобщу решение. Зависимые библиотеки не были упакованы в JAR. Таким образом, в результате

 NoClassDefFoundError:org/jsoup/Jsoup
 

Таким образом, переупаковка зависимости jsoup с использованием maven https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
решена эта проблема.

Быстрым решением было скопировать сгенерированный jar с помощью IDE.