«../Main.java:29: ошибка: конструктор JLineConsole в классе JLineConsole не может быть применен к заданным типам;» при попытке создать JAR из файла Python

#java #python #jar #jython

#java #python #jar #jython

Вопрос:

 ../Main.java:29: error: constructor JLineConsole in class JLineConsole cannot be applied to given types;
        return new JLineConsole();
               ^
  required: String
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error
  

это точная ошибка, которую я получаю. Я следую инструкциям, найденным здесь, но я постоянно застреваю на части после добавления своих библиотек в Jython / Lib:

 $ javac ../Main.java -d .
  

Когда я пытаюсь выполнить эту команду, возникает ошибка, упомянутая выше. Вот соответствующая Java:

 import java.io.FileInputStream;
import java.lang.System;
import java.util.Properties;
import org.python.core.Py;
import org.python.core.PyException;
import org.python.core.PyFile;
import org.python.core.PySystemState;
import org.python.util.JLineConsole;
import org.python.util.InteractiveConsole;
import org.python.util.InteractiveInterpreter;

public class Main {
    private static InteractiveConsole newInterpreter(boolean interactiveStdin) {
        if (!interactiveStdin) {
            return new InteractiveConsole();
        }

        String interpClass = PySystemState.registry.getProperty(
        "python.console", "");
        if (interpClass.length() > 0) {
            try {
                return (InteractiveConsole)Class.forName(
            interpClass).newInstance();
            } catch (Throwable t) {
                // fall through
            }
        }
        return new JLineConsole();
    }

    public static void main(String[] args) throws PyException {
        PySystemState.initialize(
            PySystemState.getBaseProperties(), 
            new Properties(), args);

        PySystemState systemState = Py.getSystemState();
        // Decide if stdin is interactive
        boolean interactive = ((PyFile)Py.defaultSystemState.stdin).isatty();
        if (!interactive) {
            systemState.ps1 = systemState.ps2 = Py.EmptyString;
        }

        // Now create an interpreter
        InteractiveConsole interp = newInterpreter(interactive);
        systemState.__setattr__("_jy_interpreter", Py.java2py(interp));
        interp.exec("try:n import entrypointn entrypoint.main()nexcept SystemExit: pass");
    }
}
  

Я не особенно хорошо разбираюсь в Java, но из того, что я знаю, я не вижу в этом ничего плохого.

Я пробовал это несколько раз и просматривал вопросы StackOverflow, связанные с сообщением об ошибке, которое я получаю, но ни один из них, похоже, не применим.

Я также попытался просто запустить сам Java-файл с помощью команды $ java ../Main.java . Это вызвало другую ошибку: Error: Could not find or load main class ...Main.java которую я просмотрел здесь, но ни одна из этих ошибок, похоже, не применима и к моему случаю; однако один из них дал мне предложение использовать java -Xdiag для получения более полезного сообщения об ошибке. Я сделал, и это привело:

 java.lang.ClassNotFoundException: ...Main.java
    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)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
  

Который, как я понимаю, совпадает с невербальным сообщением об ошибке и на самом деле не дает мне четкого пути вперед. У кого-нибудь здесь есть какие-либо идеи?

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

1.1) ...Main.java не является классом. 2) Вы скомпилировали Main.java с javac использованием then used java -cp . Main ?

2. спасибо за ответ @cricket_007. 1 — Я думаю, что это сделано намеренно со стороны человека, который его написал — хотя и не уверен. 2 — нет, у меня нет. Когда я пытаюсь это сделать, это выдает мне всевозможные ошибки, поэтому я постараюсь их исправить, а затем обновлю этот ответ по мере необходимости.

3. По сути, я хочу сказать, что java команда ожидает, что вы запустите class файл, полученный в результате компиляции с javac

4. Что касается первой ошибки. Я не вижу JConsole конструктора, который принимает строку

5. Я читаю ту ссылку, которую вы опубликовали, и она никогда не используется java ../Main.java для запуска программы. Он использует jar -cfe output.jar Main * after javac ../Main.java -d . , но ваш код не может быть скомпилирован из-за JConsole проблемы. Однако вам не нужно его создавать, потому что он включен как часть библиотеки, которую вы пытаетесь использовать.