просмотр кода, рефакторинг, автоматическое завершение в Emacs

Это ваш выбор. В архиве веб-приложений Java (WAR) есть три способа:


1. Поместите его в classpath

. Чтобы вы могли загрузить его с помощью ClassLoader#getResourceAsStream() с относительным путем classpath:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);

Здесь foo.properties предполагается, что они будут помещены в один из корней, которые покрываются классом по умолчанию для webapp, например webapp /WEB-INF/lib и /WEB-INF/classes, /lib сервера или JDK / JRE /lib. Если файл свойств является webapp-специфическим, лучше всего поместить его в /WEB-INF/classes. Если вы разрабатываете стандартный проект WAR в среде IDE, поместите его в папку src (исходную папку проекта). Если вы используете проект Maven, поместите его в папку /main/resources.

Вы также можете поместить его где-то за пределы пути по умолчанию и добавить свой путь к пути к классам на сервере приложений. Например, Tomcat вы можете настроить его как свойство shared.loader в Tomcat/conf/catalina.properties.

Если вы поместили foo.properties в структуру пакета Java, например com.example, вам необходимо загрузить его как показано ниже

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...

Обратите внимание, что этот путь загрузчика класса контекста не должен начинаться с /. Только когда вы используете «относительный» загрузчик классов, например SomeClass.class.getClassLoader(), вам действительно нужно запустить его с помощью /.

ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...

Однако видимость файла свойств зависит затем на класс загрузчика, о котором идет речь. Это видно только для того же загрузчика классов, что и тот, который загружал класс. Таким образом, если класс загружается, например, server common classloader вместо загрузчика классов webapp, а файл свойств находится внутри самого webapp, а затем он невидим. Загрузчик контекстного класса - это ваша самая безопасная ставка, поэтому вы можете поместить файл свойств «всюду» в путь к классам и / или вы намерены переопределить сервер, предоставленный с помощью webapp.


2. Поместите его в webcontent

Чтобы вы могли загрузить его с помощью ServletContext#getResourceAsStream() с относительным путем webcontent:

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...

Обратите внимание, что я продемонстрировал для размещения файла в папке /WEB-INF, иначе он был бы общедоступным для любого веб-браузера. Также обратите внимание, что ServletContext находится в любом классе HttpServlet, доступном только унаследованным GenericServlet#getServletContext() и в Filter на FilterConfig#getServletContext() . Если вы не находитесь в классе сервлета, его обычно можно вводить через @Inject.


3. Поместите его в локальную файловую систему диска

. Чтобы загрузить его обычным способом java.io с использованием пути к файловой системе с абсолютным локальным диском:

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...

Обратите внимание на важность использования абсолютный путь. Относительные пути локальной файловой системы на диске - это абсолютное отсутствие в веб-приложении Java EE. См. Также первую ссылку «См. Также».


Что выбрать?

Просто взвешивайте преимущества / недостатки в своих собственных мнениях ремонтопригодность.

Если файлы свойств «статические» и никогда не должны меняться во время выполнения, вы можете сохранить их в WAR.

Если вы предпочитаете редактировать файлы свойств извне веб-приложение без необходимости перестраивать и переустанавливать WAR каждый раз, а затем помещать его в путь класса вне проекта (при необходимости добавить каталог в путь к классам).

Если вы предпочитаете иметь возможность редактировать файлы свойств программно из веб-приложения с помощью метода Properties#store(), выведите его за пределы веб-приложения. Поскольку для Properties#store() требуется Writer, вы не можете использовать путь к файловой системе диска. Этот путь, в свою очередь, может быть передан в веб-приложение как аргумент VM или системное свойство. В качестве меры предосторожности никогда не используйте getRealPath() . Все изменения в папке развертывания будут потеряны при повторном развертывании по той простой причине, что изменения не будут возвращены в исходный файл WAR.

См. Также:

26
задан George Stocker 1 April 2009 в 05:34
поделиться

5 ответов

Возможно, Вы найдете мой статья о Cedet полезный. Cedet имеет поддержку завершающих тегов, gtags, cscope и других инструментов.

, Но рефакторинг отсутствует. Вы, возможно, должны изучить инструмент Xrefactory (но это не свободно)

17
ответ дан SullX 25 September 2019 в 08:00
поделиться

Cscope очень хорош, поскольку "находят символ" инструментом использования. Это очень быстро.
Завершающие теги покажут Вам Вашу иерархию классов и помогут Вам найти определение/объявление метода.

, Таким образом, эти два инструмента, должен иметь, и они независимы.

Cedet. Это - вид замены этих двух инструментов выше с дополнительными функциями. Так Ваш выбор или cscope/etags или cedet.

6
ответ дан Mykola Golubyev 25 September 2019 в 08:00
поделиться

gtags ( http://www.gnu.org/software/global/ ) также доступен и возможно более прост использовать.

2
ответ дан 25 September 2019 в 08:00
поделиться

Лично, мне не нравится cedet. Это заставляет Emacs занять час для загрузки. Функция автоматического заполнения никогда не работала совершенно верно со мной. Мне не нужны его управление проектами, ни его функции UML. Единственной вещью, которую я пропускаю об этом, является Браузер Кода Emacs, который очень полезен, но требует cedet

, который я был бы совет Вы, чтобы просто использовать cscope и завершающие теги и видеть, как Вам нравятся они. Можно установить cedet позже, как только Вы более знакомы с emacs.

1
ответ дан bigmonachus 25 September 2019 в 08:00
поделиться

Для рефакторинга я начал использовать emacs исключительно для этой и связанных задач после того, как прочитал эту статью хакера emacs Кса Ли.

Для автозаполнения см. это сообщение SO . Лично я нашел ясниппет очень полезным на протяжении многих лет.

3
ответ дан 28 November 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: