powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Пулучить директорию проекта
25 сообщений из 29, страница 1 из 2
Пулучить директорию проекта
    #39225520
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как в Java получить директорию проекта ?

Я пробую
Код: java
1.
2.
3.
			Path currentRelativePath = Paths.get("");
			String s = currentRelativePath.toAbsolutePath().toString();
			System.out.println("Current relative path is: " + s);


Но мой вариант возвращает директорию где лежит eclipse.

А мне нужен путь по которому лежит проект.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39225534
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3k,

Во-первых надо понимать что "проект" это ваш исходный код. А рантайме его не существует. В рантайме существуют классы и точка входа.

Если это понятно, то далее надо различать две вещи

1) Текущий каталог - его значение зависит от того как именно пользователь запустил Java Runtime. Иногда совпадает с тем что вы ищете.
Код: java
1.
2.
System.getProperty("user.dir");
new File("."); // Использует user.dir


По аналогии, возможно, работает и
Код: java
1.
Paths.get(".")



2) Местонахождение бинарников. По памяти примерно так:
Код: java
1.
MyClass.class.getClassLoader().getProtectionDomain().getCodeSource().getLocation();
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39225554
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz2) Местонахождение бинарников

Не факт, что бинарники обязательно загрузились с файловой системы (могли и по сети придти, например: аплеты, RMI) и путь к ним, в большинстве сред, ничего не значит. IMHO & AFAIK
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39225590
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kА мне нужен путь по которому лежит проект.

такие вещи в конфиг выносят или параметром передают.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39225606
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Penkov Vladimirтакие вещи в конфиг выносят
который поместить в проект)
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39225612
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,


Petro123Penkov Vladimirтакие вещи в конфиг выносят
который поместить в проект)

в /etc/app-name конечно же
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39225650
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНе факт, что бинарники обязательно загрузились с файловой системы (могли и по сети придти, например: аплеты, RMI) и путь к ним, в большинстве сред, ничего не значит. IMHO & AFAIK
Я бы за "большинстве сред" не ручался. Там где такой путь нужен, бинарники лежат в файловой системе. Для JEE приложений, очевидно, фича бесполезная. Для standalone - вполне себе нормальная.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226463
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так определяю,
работает и в линуксах и в окнах
Код: java
1.
2.
3.
4.
5.
6.
7.
                URL location = Class.forName("com.Singleton").getProtectionDomain().getCodeSource().getLocation();
                System.out.println(location.getPath());
                int n = location.getPath().lastIndexOf("WEB-INF");
                web_location = location.getPath().substring(0, n);
                web_location = web_location.replaceAll("%20", " ");
                System.out.println("web_location   " + web_location);
                File dir = new File(web_location + "WEB-INF/classes/wss/pages");

...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226481
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, а объясни, пожалуйста, нам с Леонидом задлянафига это понадобилось в war модуле?
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226497
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то мне кажется это странным

Данные из classes, скорее всего, можно подгружать как ресурсы.
(или через ServletContext или через тот же ClassLoader.getResourceAsStream)

Поэтому нафига нужно получать к ним путь, не очень ясно. К тому же, код с substr'ами, replace'ами выглядит на редкость корявым.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226507
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ бы за "большинстве сред" не ручался. Там где такой путь нужен, бинарники лежат в файловой системе. Для JEE приложений, очевидно, фича бесполезная. Для standalone - вполне себе нормальная.
Ну "большинство" понятие относительное )))

Для standalone, даже в современных Windows принято, что код лежит в одном месте (только для чтения), а рабочий директорий скорее всего где- то другой (и свой у каждого пользователя). Т.ч. даже для standalone - это получается "одно пользовательское" решение, что сейчас уже выглядит как атавизм.

Когда в начале 2000-х мы свое standalone приложение создавали и то пришлось столкнутся с проблемой, что ряд заказчиков работает на Windows Terminal Server. И директория, где лежит код, может оказаться совсем не personal и использовать ее "как хочешь" нельзя.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226514
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадя, а объясни, пожалуйста, нам с Леонидом задлянафига это понадобилось в war модуле?
мне надо получить список файлов из папки WEB-INF/classes/wss/pages
там из из каждого файла получить список методов.
это список используется для вызова метода с помощью рефлексии.
так наворочено - потому как это может запускаться и на продакшене под линуксом, и при разработке в netbeans под окнами.

автор К тому же, код с substr'ами, replace'ами выглядит на редкость корявым.
это для того чтоб можно было делать папки с пробелами в названиии.

если есть вариант более красивый - прошу показать.
данный работает.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226516
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДля standalone, даже в современных Windows принято, что код лежит в одном месте (только для чтения), а рабочий директорий скорее всего где- то другой (и свой у каждого пользователя). Т.ч. даже для standalone - это получается "одно пользовательское" решение, что сейчас уже выглядит как атавизм.
Это все правильно и логично только для пользовательских файлов. Бинарники могут быть read only даже без всяких терминалов.
Запрещать пользователю писать в Program Files - сейчас стандартная практика.
Но есть куча сценариев, даже для чтения. Прочитать админский конфиг, запустить сопутствующую утилиту, и т.п.
Но, выходит, на счет "большинства", ты, похоже, прав.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226527
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Во-первых это стремный подход сам по себе. На много безопаснее вести реестр таких классов и его использовать. К тому же можно не ограничиваться одним пакетом. И для этого уже есть куча готовых решений вроде аннотаций и SPI, Spring Framework.
Во-вторых в экзотических сценариях war может работать без распаковки, что делает использование java.io.File в решении задачи бесполезным.
Ну, и в-третьих, существует масса готовых реализаций: Apache Commons Discovery, Guava ClassPath и всякие Reflections и FastClasspathScanner.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226539
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадя,

Во-первых это стремный подход сам по себе. На много безопаснее вести реестр таких классов и его использовать. К тому же можно не ограничиваться одним пакетом. И для этого уже есть куча готовых решений вроде аннотаций и SPI, Spring Framework.
Во-вторых в экзотических сценариях war может работать без распаковки, что делает использование java.io.File в решении задачи бесполезным.
Ну, и в-третьих, существует масса готовых реализаций: Apache Commons Discovery, Guava ClassPath и всякие Reflections и FastClasspathScanner.
вести реестр - т.е. вручную туда заносить? это как-то не очень, я этот код написал и забыл. добавляю /удаляю методы, и больше ни о чем не заморачиваюсь.
в моём случае эти классы и должны быть в одном пакете, в этом одна из особенностей. каждый класс "привязан" к одной странице web, и в нем все методы по обработки команд для этой странице. при изменении я просто правлю один фал .java и всё, больше никких изменений ни где. не надо помнить об изменении аннотаций и прочего.
у меня нет экзотического применения - расчитано для работы с tomcat, а там war распаковывается.
если масса готовых реализаций будет проще - покажи , я воспользуюсь. на момент написания кода я не смог найти более простого
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226541
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадямне надо получить список файлов из папки WEB-INF/classes/wss/pages
там из из каждого файла получить список методов.
это список используется для вызова метода с помощью рефлексии.
так наворочено - потому как это может запускаться и на продакшене под линуксом, и при разработке в netbeans под окнами.

В такой поставке задача через стандартное API вроде не решается.

Беглый поиск по I-net выдает ссылку на Spring ф-цию:
http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/core/io/support/PathMatchingResourcePatternResolver.html

Но она реализована через такой же механизм, как и у Вас (только более подробный). В сложных ситуациях, когда ClassLoader не смотрит на файлы, а получает их как-то по другому - так же работать не будет.

вадяэто для того чтоб можно было делать папки с пробелами в названиии.

если есть вариант более красивый - прошу показать.
данный работает.
Это то понятно. Только есть ощущение, что не только пробелы могут так кодироваться, но и другие спец-символы / русские буквы. Поэтому код с replace'ами выглядит не сильно хорошо.

getLocation по доке возврашает URL. Т.ч. было бы логично, вместо самодельного replace попытаться использовать какой нибудь метод URL encode/decode или File прямо из URL и конструировать.

IMHO
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумно опираться на tmp.dir для временных файлов. Или на особые каталоги логгирования
и переменные окружения веб-контейнеров. Опять-же если есть файловое хранилище - то оно
обычно mount-ится отдельно и к нему путя знает админ.

А просто так "срать под себя" в каталогах деплоя ни один нормальный админ не позволит.

Вобщем всё зависит от целевого назначения проекта и мы ответа не узнаем т.к.
автор-редиска сбежал и оставил нас один на один с вопросами.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226563
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявести реестр - т.е. вручную туда заносить?

Да, хотя бы и вручную. Все лучше этого кода с кучей условностей.

вадякаждый класс "привязан" к одной странице web, и в нем все методы по обработки команд для этой странице.
Ну, вот о том и речь, что есть некий реестр страниц и таких классов.

вадяпри изменении я просто правлю один фал .java и всё, больше никких изменений ни где. не надо помнить об изменении аннотаций и прочего.
Это фантомная польза. Если ты добавляешь нужную страницу, ты все равно её тестируешь, поэтому не забудешь добавить её в реестр.

вадяу меня нет экзотического применения - расчитано для работы с tomcat, а там war распаковывается.

У меня, например, сейчас куча разношерстных небольших проектов в одной предметной области. Массу кода приходится пере-использовать. Ну, и вообще писать переносимый код считается хорошим тоном.

вадяесли масса готовых реализаций будет проще - покажи , я воспользуюсь. на момент написания кода я не смог найти более простого
Перечислил же выше. Опять же, сейчас JEE контейнеры вынуждены сканировать все классы на предмет аннотаций.
https://wiki.apache.org/tomcat/HowTo/FasterStartUp
Можно было бы хотя бы на эту фичу подсесть.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226567
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадякаждый класс "привязан" к одной странице web, и в нем все методы по обработки команд для этой странице.
вадямне надо получить список файлов из папки WEB-INF/classes/wss/pages
там из из каждого файла получить список методов.
это список используется для вызова метода с помощью рефлексии.
Это типа маппинг урл на методы-классы?
Код: java
1.
2.
@WebServlet("/posts")
public class posts extends HttpServlet {
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226570
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczМожно было бы хотя бы на эту фичу подсесть.
+1
вроде аннотации для этого и придумали.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226574
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто то понятно. Только есть ощущение, что не только пробелы могут так кодироваться, но и другие спец-символы / русские буквы. Поэтому код с replace'ами выглядит не сильно хорошо.

getLocation по доке возврашает URL. Т.ч. было бы логично, вместо самодельного replace попытаться использовать какой нибудь метод URL encode/decode или File прямо из URL и конструировать.

IMHO
-согласен, но для себя ввел ограничения на русские названия папок , и снял часть проблем :)
-было б не плохо, но бысто решения не нашёл, остановился на таком, не очень красивом... хотя и рабочем.
к тому же web_location используется ещё в одном месте - для подключения нативных библиотек, разных для линукса и оконо.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226575
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

В Tomcat есть JarScanner, на который можно было бы подсесть, но он, к сожалению, не предрасположен к пиггибэкингу.
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226579
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто фантомная польза. Если ты добавляешь нужную страницу, ты все равно её тестируешь, поэтому не забудешь добавить её в реестр.

было что-то подобное в начале - замаялся править...
авторУ меня, например, сейчас куча разношерстных небольших проектов в одной предметной области. Массу кода приходится пере-использовать. Ну, и вообще писать переносимый код считается хорошим тоном.
дак у меня этот код тож переносится один в один уже в нескольких проектах, без изменения - копи/пастом. весь(почти) Singleton

2Petro123
это методы по обработки команд для websocket :)
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226589
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
@WebServlet("/posts")
public class posts extends HttpServlet {



у меня для каждой страницы до 20+ команд, а обработка команды это метод из 10-20 строк кода, большая часть из которых
"служебная" и городить сервлет на каждую команду - как-то не очень.
рамещать в одном сервлете несколько команд - это тоже не очень - надо городить либо if либо swich
что также не очень...
...
Рейтинг: 0 / 0
Пулучить директорию проекта
    #39226618
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Код: java
1.
2.
@WebServlet("/posts")
public class posts extends HttpServlet {




у меня для каждой страницы до 20+ команд, а обработка команды это метод из 10-20 строк кода, большая часть из которых
"служебная" и городить сервлет на каждую команду - как-то не очень.
рамещать в одном сервлете несколько команд - это тоже не очень - надо городить либо if либо swich
что также не очень...
это пример использования аннотаций....как технологии.
Тебе сказали, что искать место в коде ВООБЩЕ или как то его помечать = аннотации.
Это понятие шире чем сервлеты.
Вполне могли подойти под твою задачу.
Поэтому аннотации можно применять и без сервлетов.
Удачи!
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Пулучить директорию проекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]