Статьи

Как добавить JAR-файлы в проект Jetbrains MPS

Jetbrains MPS — замечательный инструмент для создания DSL. Мы любим его и регулярно используем в нашей консультационной работе. Так что мы писали про Jetbrains MPS раньше .

Будучи проекционным редактором, вы можете легко создавать DSL, которые можно использовать через графический интерфейс или такие вещи, как математические формулы. Хотя вся эта мощь требует небольшой подготовительной работы.

Одной из наиболее важных характеристик MPS является тот факт, что он позволяет повторно использовать код Java. Новый Java-код может быть написан на MPS через то, что он называется BaseLanguage . Однако иногда мы хотим просто повторно использовать существующий код Java внутри MPS.

В этом уроке мы увидим:

  1. Как вы можете загрузить JAR-файлы в MPS
  2. Как мы используем эту функцию для решения общей проблемы: загрузка статических ресурсов с помощью Java для использования их в коде Jetbrains MPS.

Сначала мы увидим, как создать новый JAR, содержащий ресурсы, а затем, как загрузить существующий JAR в Jetbrains MPS.

Вы можете найти исходный код этого проекта в сопутствующем хранилище .

Создание JAR, содержащего статические ресурсы

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

Структура проекта традиционная Java с resources и каталогами src .

Проект gradle прост, все, что нам нужно сделать, это создать файл build.gradle со следующим содержимым.

1
2
3
4
apply plugin: 'java'
  
sourceSets.main.resources.srcDirs = [ "resources/" ]
sourceSets.main.resources.includes = [ "**/*.png", "**/*.gif" ]

Все, что мы сделали, это указали, где найти ресурсы и какие файлы включить, в нашем случае файлы изображений для иконок.

Класс Java одинаково тривиален, мы делаем иконки доступными как статические поля.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.strumenta.examples.icons;
  
import javax.swing.*;
  
public class ExamplesIcons {
     
    public static final ImageIcon MAIN;
    public static final ImageIcon CIRCLE;   
  
    static {
        MAIN = createImageIcon("/com/strumenta/examples/icons/main.png", "Main Icon");
        CIRCLE = createImageIcon("/com/strumenta/examples/icons/circle.png", "Circle Icon");
    }
  
    private static ImageIcon createImageIcon(String path, String description) {
        java.net.URL imgURL = ExamplesIcons.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL, description);
        } else {
            System.err.println("Icon not loaded: " + path);
            return null;
        }
    }
}

Поскольку мы создаем значки, нам нужно импортировать правильную зависимость Javax Swing.

Теперь мы входим в основной каталог проекта gradle и создаем его.

1
2
3
4
# Linux/Mac OS/Cygwin
./gradlew jar
# Windows
./gradlew.bat jar

Конечным результатом должен быть файл resources_project.jar в каталоге build/libs/ .

Проект MPS

Теперь, когда у нас есть JAR с иконками, мы должны сделать его доступным для кода MPS. Вы можете использовать ту же процедуру с любым существующим кодом JAR, который у вас есть.

Мы предпочитаем импортировать статический ресурс в собственное решение, потому что оно делает проект чище. Итак, мы начнем с создания решения с именем com.strumenta.examples.external , которое создает каталог с таким именем и MSD-файлом с тем же именем. Внутри каталога также будет каталог models . Внутри каталога com.strumenta.examples.external мы вручную добавляем каталог libs с помощью нашего resources_project.jar .

Нам все еще нужно добавить сгенерированную библиотеку в модуль, перейдя в Свойства модуля ( Alt + Enter ):

  1. на вкладке Зависимости добавляем модуль JDK и затем выбираем Экспорт
  2. на вкладке Java, в разделе Библиотеки, мы добавляем JAR-файл. В MPS вы увидите полный путь, но внутри MPS сохраняет относительный путь, потому что мы вставили JAR в каталог решения. Это очень важно, потому что это означает, что другие участники, работающие над проектом на других машинах, получат правильный результат, даже если они поставят проект на другой путь
  3. на вкладке Common мы нажимаем Add Model Root-> java_classes, затем выбираем JAR-файл на правой панели и нажимаем Sources чтобы добавить его содержимое в модели

Если вашим библиотекам нужен сторонний Java-код, вы должны выполнить шаги 2 и 3 для ваших зависимостей. В нашем случае мы используем сторонний код (Javax Swing), но он уже входит в состав платформы JDK. Так что нам больше ничего не нужно делать.

В реальном сценарии проблема заключается в том, что может быть много зависимостей, особенно для сложных проектов. Итак, вы можете сначала собрать все зависимости с помощью стандартного инструмента, такого как gradle или maven, а затем вставить их в MPS.
Если вы сейчас ExampleIcons файл ExampleIcons , вы должны увидеть нечто похожее на следующее изображение.

Если вы видите некоторые ошибки в examplesIcons, вы, вероятно, добавили вещи в неправильном порядке. Сначала нужно добавить модуль JDK, чтобы MPS мог автоматически добавлять то, что нужно. Чтобы убедиться, что все работает хорошо, вы также можете взглянуть на Свойства модели модели icons@java_stub model , она должна автоматически включить Java и Javax.Swing в свои зависимости (вы не можете добавить их вручную).

Чтобы проверить включение, вы можете использовать консоль MPS. Используйте CTRL + M, чтобы включить внешнее решение, а затем попробуйте команду printText с инструкцией printText ExamplesIcons.MAIN.getDescription() , как printText на следующем рисунке. Затем нажмите кнопку « Выполнить» : тт должно напечатать «Главный значок»

И это в основном все, вы просто должны помнить, чтобы включить модуль com.strumenta.examples.external в качестве зависимости в каждом модуле, в котором вы используете код, включенный в JAR. Если вы хотите использовать ресурсы в плагине или симуляторе, вы можете добавить его в качестве зависимости во время выполнения.

Включить JAR в модели сборки

Если вы генерируете плагины или пользовательские версии MPS, вы будете использовать модели сборки. В этом случае вы должны добавить свой JAR в эти модели сборки.
Например, если вы генерируете плагин, вы должны скопировать JAR в каталог плагина, как показано на следующем рисунке.

Если вы забыли это сделать, вы получите сообщение об ошибке, когда попытаетесь сгенерировать модель, связанную со сборкой плагина.

Смотрите оригинальную статью здесь: Как добавить JAR-файлы в проект Jetbrains MPS

Мнения, высказанные участниками Java Code Geeks, являются их собственными.