Есть ли чистый способ устранить проблему с путями к файлам, независимо от того, запускается программа из консоли или Eclipse?

#java #eclipse #console

#java #eclipse #консоль

Вопрос:

В настоящее время я работаю над проектом Java, в котором мне нужно открывать файлы, которые я сохранил в каталоге данных рядом с src.

Когда я запускаю свою программу из Eclipse, чтобы получить доступ к этим файлам: я набираю "data/fileName" , тогда как при использовании консоли я должен вводить "../data/fileName" .

(Мне не удалось выполнить java src/Main из каталога проекта и я получил сообщение об ошибке :

Error: Could not find or load main class src.Main.java

Caused by: java.lang.ClassNotFoundException: src.Main.java )

Есть ли способ сделать мою программу работоспособной как на консоли, так и на Eclipse?

Чтобы дать некоторый контекст: обычно я намеревался работать только в Eclipse, но я столкнулся с проблемами при запуске nano из Eclipse (переменная $ TERM , перенаправление каналов на dev / tty также), поэтому выполнение консоли стало обязательным требованием.

Я не могу изменить свою конфигурацию Eclipse, поскольку этот проект не будет запущен на моем компьютере, и если он не запускается из-за настроек Eclipse по умолчанию, хорошо…

Спасибо за ваши ответы.

Сердечно.

Ответ №1:

ДА. Не помещайте туда эти файлы. Существует 2 широкие категории:

  • Данные, доступные только для чтения, которые являются такой же частью вашего приложения, как и ваши файлы классов. Подумайте о «списке состояний США для выпадающего списка «состояние»», «значок png, который будет отображаться в моем пользовательском интерфейсе», «файл, содержащий кучу SQL, который будет использоваться для инициализации пустой базы данных» и многое другое.

Для этого правильный путь YourClass.class.getResourceAsStream("foo.txt") — это предоставить вам входной поток для чтения файла «foo.txt «, который находится в том же месте «YourClass.class » есть. Даже если он находится, например, в файле jar.

Это означает, что как часть вашей сборки, эти файлы должны быть в jar. ограниченная система сборки eclipse делает это. Если вы повышаете уровень как программист и используете систему сборки (здесь вы должны повышать уровень), поместите их в src / main / resources, и система сборки должна позаботиться об этом.

  • Или вторая категория: файлы, которые пользователь должен редактировать, или файлы, которые необходимо изменить вашим приложением.

Они не идут ни в какое сравнение с вашим файлом jar; исполняемый и редактируемый пользователем материал не должны находиться рядом друг с другом. Они должны быть в домашнем каталоге пользователя, вы можете получить его с System.getProperty("user.home") помощью.

Обратите внимание, что для запуска java-файлов «src» вообще не должен быть частью истории, java не может запускать исходные файлы, только файлы классов. Кроме того, аргумент — это не каталог, это имя класса. java -cp path/to/your/app.jar com.foo.pkg.YourClass это то, как вы запускаете Java-код, а не java src/Main .

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

1. Да, и фактически нет никакого возможного способа заставить это работать, не сообщая вашему приложению явно, где искать, например, путем передачи аргумента (который поступит как часть args in public static void main(String[] args) .

2. Ну, мои файлы относятся ко второй категории. Поскольку это проверенный проект, указания заключались в создании данных рядом с src (похоже, меня учили… нетрадиционная java. Даже система сборки не в курсе! ) Хотя спасибо за информацию. В первом случае использование метода со строковым параметром fileName и последующее создание входного потока с его помощью плохо? Я обычно делаю javac Main.java это тогда java Main , поэтому я подумал, что после javac java src/Main все будет в порядке.