LINUX.ORG.RU

Java, maven пара вопросов

 ,


1

1

Здравствуйте,

Подскажите best practice по организации Java maven проекта. Допустим есть ряд файлов с каких нужно читать и которые юзер будет обновлять на сервере (например список имен, городов, прокси и тд) Пихать это в папку resources как я понимаю не стоит. Я создаю папку files в корне проекта где лежит файл pom.xml В эту папку ложу файлы.

Jar файл же генерируется в target папку. И естественно если запустить с этой папки jar то файлы он не найдет (в коде так выглядит: File myFile = new File("./files/file.txt");)

Netbeans же нормально запускает по Run. Однако netbeans не видит папку files на вкладке projects, только во вкладке Files.

Я вот не понимаю как лучше поступать с такими вот файлами? Как правильнее работать? Конечно можно скопировать папку с файлами, положить туда jar файл в корень и все будет хорошо, но правильно ли? Мне кажется что я что-то делаю не так.

С Java пока что на ВЫ.



Последнее исправление: hctr (всего исправлений: 2)

При запуске из нетбинса все работает т.к. приложение стартует из каталога проекта.

Самое правильное - передавать путь к файлу при запуске.

ya-betmen ★★★★★
()
Ответ на: комментарий от hctr

Каким образом? Аргументом?

Хз что за проект, возможно аргуметном

А если файлов много?

Передавать путь к файлу конфига

ya-betmen ★★★★★
()

Вынеси местоположение этих файлов в конфиг. Конфиг грузи из resources. Т.е. у тебя будет файл src/main/resources/configuration.properties. В нём будет строчка вроде names = /home/hctr/myapp/names.txt. Приложение сначала загружает configuration.properties, читает его и загружает написанные там файлы по нужным путям. Для разработки можешь прописать относительные пути, при запуске на сервере заменишь на нужный конфиг.

А вообще обычно делается дистрибутив программы. Это и jar-файл самой программы и jar-файлы с зависимостями и какие-то скрипты запуска. Там же могут быть и конфиги и всё остальное.

Вообще Java как таковая тут не при чём, вопрос организации конфигов универсальный. Посмотри, как в других программах сделано и сделай как тебе понравится. Ни Java ни Maven тебя тут никак не ограничивают.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

Пихать это в папку resources как я понимаю не стоит

это еще почему?

anonymous
()
Ответ на: комментарий от Legioner

Legioner,ya-betmen спасибо

Ну опять же если юзер хочет положить в какую-то свою папку все это добро? Если я запихну настройки в src/main/resources/configuration.properties то юзер не изменит настройки так как этот файл будет в jar файле.

Посмотреть в других программах это правильная мысль. Я смотрел, часто засовывают в resources папку и потом читают как с ресурсов.

Я же хочу чтобы все добро было по дефолту в одной папке:

files (folder) user.txt app.jar

hctr
() автор топика
Ответ на: комментарий от Legioner

Можете кинуть пару ссылок на проекты на github или еще где. Хочется посмотреть как правильно делают.

hctr
() автор топика
Ответ на: комментарий от hctr

Ну опять же если юзер хочет положить в какую-то свою папку все это добро? Если я запихну настройки в src/main/resources/configuration.properties то юзер не изменит настройки так как этот файл будет в jar файле.

Во-первых jar-файл можно распаковать и запускать каталог. А там уже меняй что душе угодно. Во-вторых jar-файл можно перепаковать с нужным файлом, это почти обычный zip-архив. В-третьих можно сконфигурировать какой угодно classpath. При загрузке ресурса он будет грузиться из места, которое в classpath указано первым. Например можно запускать как java -cp myapp/conf:myapp/lib/myapp.jar my.Main, в этом случае всё, что лежит в conf будет иметь приоритет перед тем, что лежит в myapp.jar.

Я же хочу чтобы все добро было по дефолту в одной папке:

files (folder) user.txt app.jar

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

Legioner ★★★★★
()
Ответ на: комментарий от hctr

Можете кинуть пару ссылок на проекты на github или еще где. Хочется посмотреть как правильно делают.

Любую программу из линукса открывай и смотри. nginx, postfix, opensmtpd, тысячи их.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Legioner теперь все понятно, спасибо тебе большое

hctr
() автор топика

Если будешь обновлять файлы, то создавай папку по пути ~/.yourAppName. И храни все файлы здесь. В джаве есть даже переменная окружения user.home вроде называется. Которая кроссплатформенная и будет работать даже в винде (наверное).

Изначальные файлы храни по classpath в папке ресурсов например. Когда проект стартует проверяешь существование ~/.yourAppName и нужных файлов. Если чего-то не хватает достаешь через ClassLoader.getResource и копируешь в ~/.yourAppName. Если все хватает, то просто работаешь с файлами по пути ~/.yourAppName

Если у тебя какой-то демон без user.home. То тогда конфиги можно хранить в /etc/yourAppName предварительно дав права на запись приложению. Ну или как выше сказали, смотри где-тот mysql/postgres хранит свои данные.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 3)

Можно еще посмотреть на JBOSS

wieker ★★
()
Ответ на: комментарий от foror

foror спасибо

Еще тогда такой вопрос. Как быть с простыми утилитами или скриптами? Например когда их много. Удобнее все файлы держать в одной папке же.

hctr
() автор топика
Ответ на: комментарий от foror

смотри где-тот mysql/postgres хранит свои данные.

Это понятно но для более простых вещей хотелось бы все в одном месте.

hctr
() автор топика
Ответ на: комментарий от hctr

Ну так назови все утилиты общим именем hctr и храни в этой папке все файлы, хоть в ~/.hctr, хоть в /opt/hctr, хоть в /var/lib/hctr

foror ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.