Разработка плагина IntelliJ IDEA. Часть 3
Немного теории о проектах и VFS. Предыдущая часть тут.
Структура проекта
В IntelliJ IDEA проект инкапсулирует все исходные коды, библиотеки, сценарии сборки в едином организационном блоке. Абсолютно все действия в IDEA происходят в контексте проекта. Проект может содержать коллекции модулей и библиотек. В зависимости от логических или функциональных требований, можно создать одномодульный или многомодульный проект.
Модули
Модуль – это отдельная сущность функциональности, которая может быть запущена, протестирована и отлажена независимо.
Модули включают такие вещи как исходные коды, сценарии сборки, юнит-тесты, и т.д. Каждый модуль в проекте может использовать определенный SDK, либо наследовать SDK проекта. Модули могут зависеть от других модулей в проекте.
Библиотеки
Каждый проект использует Software Development Kit (SDK). Для Java проектов существует специальный тип SDK, называемый JDK (Java Development Kit). SDK определяет какой API используется при сборке проекта. В многомодульном проекте, по-умолчанию, SDK наследуется всеми модулями, но также возможно определить отдельные SDK для соответствующих модулей.
Facet
Facet – это функциональность, ассоциированная с модулем, сообщающая как взаимодействовать с содержимым модуля. Модуль может иметь несколько Facets.
В IntelliJ IDEA Ultimate Edition имеется настройка в параметрах проекта, позволяющая назначать Facets, в отличие от Community Edition, где назначение Facet доступно лишь из API.
Строение проекта
С точки зрения разработчика плагина, структура проекта выглядит так, как показано на рисунке ниже.
Проект содержит один или несколько модулей. Каждый модуль включает исходный код плагина и вызывает упорядоченный набор сущностей, связанных с SDK и библиотеками. Модуль может иметь набор Facets.
Работа с файлами проектов, модулями, библиотеками
Виртуальная файловая система IntelliJ IDEA
Снапшоты работают на уровне приложения, поэтому даже при множественных ссылках из различных проектов, данные сохраняются в единственном экземпляре.
Все операции по доступу проходят через снапшот, если запрошенная информация недоступна, то она подгружается с диска. Содержимое файлов и список файлов в директории сохраняются, только если запрошена специфическая информация, в остальных случаях сохраняется только метаинформация (имя, размер и т.д.).
Все операции по записи – синхронны, т.е. данные записываются на диск немедленно.
IntelliJ IDEA выполняет асинхронную операцию полного обновления содержимого при запуске. Также, по-умолчанию, обновление происходит при переключении из другого приложения, но это поведение можно настроить на вкладке «Settings | Synchronize files».
Операция синхронизации основана на временных метках, если дата модификации не изменилась, то IDEA не обновляет содержимое файла. По возможности IntelliJ IDEA использует встроенные в операционную систему наблюдатели за файлами (inotify, epoll и т.д.).
События виртуальной файловой системы
Все изменения, происходящие с виртуальной файловой системой, как результат выполнения операции обновления или из-за действий пользователя называются событиями виртуальной файловой системы.
Наиболее эффективный путь слежения за событиями VFS – это реализация интерфейса BulkFileListener и подписка на VirtualFileManager.VFS_CHANGES. Этот API предоставляет список всех изменений, произошедших во время операции обновления, что позволяет производить пакетную обработку. Альтернативный путь – реализация интерфейса VirtualFileListener и регистрация его посредством VirtualFileManager.addFileListener(). Этот вариант позволяет обрабатывать изменения поодиночке.
Не стоит забывать, что обработчики работают на уровне приложения, следовательно, получают события ото всех открытых пользователем проектов. Поэтому в первую очередь стоит отфильтровать только релевантные активному проекту события.
При обновлении создаются события только для файлов, загруженных в снапшот. Поэтому если одиночный файл был загружен через VirtualFile.findChild(), то изменения, происходящие с ним будут отслеживаться, а с соседними по директории – нет.
В следующей части: лексический, синтаксический разбор, PSI, Stub index.
Посов И.А.
just a site
Проект в IntelliJ IDEA
Я отдельно хочу обсудить, что такое проект в IntelliJ IDEA и как он устроен. Эти знания помогают решать проблемы, когда IDEA работает неправильно, а программы в ней не запускаются. Практика показывает, что проблемы с IDEA встречаются часто, а преподаватель, который может их решать, не всегда находится рядом.
Как проект устроен на диске
Слева в IDEA вы видите файлы и каталоги проекта так же, как они расположены у вас на диске. Сравните открытый проект и открытый каталог:
Какие файлы и каталоги есть в каталоге проекта:
Каталог src
Это каталог с исходными файлами, именно туда нужно складывать все java файлы, которые вы пишете. src специально помечен для этого синим цветом, если он не синий, значит, с проектом что-то не так, и файлы оттуда запускаться не будут. Мы ниже увидим, где настраивается, в каких папках лежат исходники.
Скопируйте в src все свои программы, которые вы успели написать с начала семестра, если вы это еще не сделали.
В каталог src можно класть только исходные коды, т.е. java файлы. Поэтому убедитесь, что вы не положили туда никаких bat файлов, class файлов, никаких файлов, которые читает или пишет ваша программа.
Каталог out
Каталог out помечен оранжевым. Если нет, значит опять что-то не так с проектом, и его надо настроить. Про это ниже.
Лучше всего этот каталог не трогать и относиться к нему бережно. Это важная часть проекта. Не удаляйте его, не изменяйте вручную его содержимое, перемещайте вместе с каталогом проекта.
Проект в IDEA состоит из модулей. Они необходимы, если вы разрабатываете большой проект, состоящий из нескольких обособленных частей. Например, у вас может быть веб-проект, где отдельно вы программируете
