Проблемы с RunnableInterfaces в Java JDK-20
У меня проблемы с импортом интерфейса в Java. В intellj я могу выполнить код, несмотря на ошибки. Когда я делаю это с самой Java, это не работает. Вы можете помочь мне?
Это мой интерфейс.
package jexample;
import java.util.Vector;
public interface RunnableInterface {
public void run(Vector<String> args);
}
Это мой MyCryptMain.java:
package jexample;
import java.util.Vector;
public class MyCryptMain {
static final String PROG_NAME = "MyCryptMain";
static final String SCOPE = "jexample.";
public static final String[][] MY_ARRAY = {
{"-genkeys", SCOPE + "RunGenKeys"},
{"-encrypt", SCOPE + "RunEncrypt"},
{"-decrypt", SCOPE + "RunDecrypt"},
{"-copy", SCOPE + "RunCopy"}
};
public static void usage() {
String msg[] = {
"Program '" + PROG_NAME + "'",
"usage:",
"\t" + PROG_NAME + " " + MY_ARRAY[0][0]
+ " [priv_keyfile] [pub_keyfile]",
"\t" + PROG_NAME + " " + MY_ARRAY[1][0]
+ " [pub_keyfile] [ifile] [ofile] ",
"\t" + PROG_NAME + " " + MY_ARRAY[2][0]
+ " [privkeyfile] [ifile] [ofile] ",
"\t" + PROG_NAME + " " + MY_ARRAY[3][0]
+ " [dummyword] [ifile] [ofile] ",
""
};
for (int i = 0; i < msg.length; ++i) {
System.err.println(msg[i]);
}
System.exit(0);
}
public static void main(String[] args) throws Exception {
RunnableKeyValueFactory runnableKeyValueFactory = new RunnableKeyValueFactory(MY_ARRAY);
int argSize = args.length;
if (argSize <= 0) {
usage();
}
String cmdKey = new String(args[0]);
if (!runnableKeyValueFactory.containsKey(cmdKey)) {
usage();
}
Vector<String> optArgVector = MyUtils.shiftArgs(args, 5);
RunnableInterface myRun = runnableKeyValueFactory.getInstanceFromKey(cmdKey);
myRun.run(optArgVector);
System.out.println("Ende des Programms.");
}
}
Это моя структура папок:
C:.
\---jexample
MyCryptMain.java
MyUtils.java
RunCopy.java
RunDecrypt.java
RunEncrypt.java
RunGenKeys.java
RunnableBase.java
RunnableFactory.java
RunnableInterface.java
RunnableKeyValueFactory.java
Как видите, все файлы находятся на своих местах и их можно найти.
javac .\MyCryptMain.java
.\MyCryptMain.java:56: error: cannot find symbol
RunnableKeyValueFactory runnableKeyValueFactory
^
symbol: class RunnableKeyValueFactory
location: class MyCryptMain
.\MyCryptMain.java:57: error: cannot find symbol
= new RunnableKeyValueFactory(MY_ARRAY);
^
symbol: class RunnableKeyValueFactory
location: class MyCryptMain
.\MyCryptMain.java:75: error: cannot find symbol
Vector<String> optArgVector = MyUtils.shiftArgs(args, 5);
^
symbol: variable MyUtils
location: class MyCryptMain
.\MyCryptMain.java:78: error: cannot find symbol
RunnableInterface myRun
^
symbol: class RunnableInterface
location: class MyCryptMain
4 errors
Тем не менее, java (javac) не находит интерфейс. Не могли бы вы мне помочь, пожалуйста?
Приветствую Лифекс.
Я ожидал, что Java найдет интерфейс и продолжит нормальное выполнение программы. В Intelj с OpenJDK 20 тоже работает без проблем.
1 ответ
Вы запускаете компилятор Java из неправильного каталога.
Кажется, вы запускаете команду из каталога. Это не ясно, но это можно понять из структуры каталогов и того факта, что вы компилируете класс, используяjavac .\Main.java
. Вы также говорите, что код компилируется в IntelliJ. В этом случае все классы должны быть пакетом.
Когда компилятор Java начнет компилировать вашMain
class и ему нужно найти класс в пакете, он ищет файлRunnableKeyValueFactory.java
в подкаталоге текущего каталога. Потому что ты бежишьjavac
изнутриjexample
каталоге, компилятор Java ищет этот класс в
C:\-----\jexample\jexample\RunnableKeyValueFactory.java
Я подозреваю, что этот файл не существует. Следовательно, компилятор не может найти вашRunnableKeyValueFactory
сорт.
Попробуйте перейти в родительский каталог и запуститьjavac .\jexample\MyCryptMain.java
. Ваш код должен скомпилироваться оттуда, иначе вы должны получить различные ошибки компилятора.
Обратите внимание, что компилятор Java не определит автоматически, что вы находитесь в подкаталоге, имя которого соответствует пакету, и автоматически начнет поиск классов из родительского каталога.