Как настроить Sublime Text для запуска кода на Java?
Была проблема: Build в Sublime не сообщал в консоли никаких результатов запуска кода кроме времени его выполнения. Решилось созданием (копированием из интернетов) нового Build System:
java файл testcode лежит в папке с названием testcode. Файлы запускаются из Command Prompt, обратная связь есть, но строка package у меня везде закомментирована или отсутствует. Поскольку стоит её активировать в виде package testcode;, как файл запускаться перестанет с ошибкой:
Error: Could not find or load main class testcode
Caused by: java.lang.NoClassDefFoundError: testcode (wrong name: testcode/testcode).
При этом в самой папке появляется ещё одна папка testcode c файлами классов (но копирование исходных файлов java в эту папку ничего не меняет, за исключением того, что в папке появляется третья вложенная папка с таким-же именем и файлами классов).
Как поменять sublime-build или как настроить Sublime иным способом чтобы можно было запускать файлы java со строкой package (и разделить уже наконец мои черновики на пакеты).
Я в теории понимаю что нужен classpath, я его уже мучал. Как это сделать? Если в sublime-build вписать:
"-cp ${file_path}",
то на выходе я получаю:
error: invalid flag: -cp полный путь к файлу
oldestRoman, для отладки вместо выполнение сделайте
эхо и прочитайте что вы пытаетесь выполнять и узнаете в чем ошибка
аргумент класспат для списка jar ов (через двоеточие в юника или точ с запятой в виндо з ) или диреторий где файлы с расш class но вторая опция сложнее и не рекомендуется если только она не тривиальная типа точки
Я не понимаю, почему "-cp", ".", перед именем файла не мешает запуску, если строка package закомментирована, но и не помогает ему, если она активная. Можете сказать, каким образом в sublime-build добавить текущую директорию как classpath?
oldestRoman, по моему если хотите научить сублим сначала в командной строке работы добейтесь а потом уж в сублим json конвертируйте зная что нужено полуичть
вообще забивать гвозди микроскопом
-
зло
переходите туда где другие сидят
Итого, что мы имеем с гуся. Во-первых никто не знает, как это работает, кто знал — видимо уже не расскажут, ибо мёртвые не выдают секретов. Определённая польза от чтения, конечно, есть. Во-первых стало немного понятно, как работает сам JSON-file: cmd": [] Список исполняемых аргументов-буков, где в кавычках через запятую они и изложены: "javac", "-J-Dfile.encoding=utf8", "-d", ".", "$file_name" буквально консольное
javac -J-Dfile.encoding=utf8 -d . мойфайл.java
где -J c флагом — заставляет javac сменить кодировку для отображение русских букв, а -d . говорит ему положить class-файлы в корневую папку проекта (что выглядит лишним, потому что он кладёт их туда и без этого ключа)
&& — разумеется логическое и ещё, после чего следует start cmd /k — запустить консоль Windows и не закрывать её, в которой выполнить java сгенерированный.файл
Вроде всё просто. Команды можно повторить вручную в консоли, если строки package нет, всё штатно отработает. А вот если она есть... В сгенерированном без этой строки класс-файле путь выглядит как папка , со строкой из имени класса — папка/папка. Но он не запускается не из корня, не из папки, не из папки/папки, мать его... не просто так, ни с командой -cp ., ни с командой -сp .. из любого места от корня выше или ниже. Хотя везде написано "просто убедитесь что имя пакета идентично структуре папок на диске относительно корневой директории и вы написали буквы в правильном регистре“. Видимо это сакральное знание придётся отложить на более позднюю ступень.
Итого, что мы имеем с гуся. Во-первых никто не знает, как это работает, кто знал — видимо уже не расскажут, ибо мёртвые не выдают секретов. Определённая польза от чтения, конечно, есть. Во-первых стало немного понятно, как работает сам JSON-file: cmd": [] Список исполняемых аргументов-буков, где в кавычках через запятую они и изложены: "javac", "-J-Dfile.encoding=utf8", "-d", ".", "$file_name" буквально консольное
javac -J-Dfile.encoding=utf8 -d . мойфайл.java
где -J c флагом — заставляет javac сменить кодировку для отображение русских букв, а -d . говорит ему положить class-файлы в корневую папку проекта (что выглядит лишним, потому что он кладёт их туда и без этого ключа) && — разумеется логическое и ещё, после чего следует start cmd /k — запустить консоль Windows и не закрывать её, в которой выполнить java сгенерированный.файл
Вроде всё просто. Команды можно повторить вручную в консоли, если строки package нет, всё штатно отработает. А вот если она есть... В сгенерированном без этой строки класс-файле путь выглядит как папка , со строкой из имени класса — папка/папка. Но он не запускается не из корня, не из папки, не из папки/папки, мать его... не просто так, ни с командой -cp ., ни с командой -сp .. из любого места от корня выше или ниже. Хотя везде написано "просто убедитесь что имя пакета идентично структуре папок на диске относительно корневой директории и вы написали буквы в правильном регистре“. Видимо это сакральное знание придётся отложить на более позднюю ступень.
P.S. Написал я это и пошёл грустно читать RTFM. А там такое интересное место:
Я-то командую "java", "$file_base_name". А что, если вместо этого скомандовать "java", "$file_base_name.$file_base_name"
И хлоп. Вопрос решился. А папке с файлом java создаётся папка с именем файла, в которой лежат файлы класса со строкой package, которые успешно запускаются.
Но для красоты хотелось бы понять, как передать консоли команду обработать классы лежащие непосредственно в корневой папке без создания дополнительной.