#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 usedjava -cp . Main
?2. спасибо за ответ @cricket_007. 1 — Я думаю, что это сделано намеренно со стороны человека, который его написал — хотя и не уверен. 2 — нет, у меня нет. Когда я пытаюсь это сделать, это выдает мне всевозможные ошибки, поэтому я постараюсь их исправить, а затем обновлю этот ответ по мере необходимости.
3. По сути, я хочу сказать, что
java
команда ожидает, что вы запуститеclass
файл, полученный в результате компиляции сjavac
4. Что касается первой ошибки. Я не вижу
JConsole
конструктора, который принимает строку5. Я читаю ту ссылку, которую вы опубликовали, и она никогда не используется
java ../Main.java
для запуска программы. Он используетjar -cfe output.jar Main *
afterjavac ../Main.java -d .
, но ваш код не может быть скомпилирован из-заJConsole
проблемы. Однако вам не нужно его создавать, потому что он включен как часть библиотеки, которую вы пытаетесь использовать.