Jetbrains MPS是创建DSL的绝佳工具。 我们喜欢它,并在我们的咨询工作中定期使用它。 因此,我们之前已经写过关于Jetbrains MPS的文章 。
作为投影编辑器,您可以轻松创建可通过图形界面或数学公式之类使用的DSL。 尽管所有这些功能都需要做一些准备工作。
MPS的最重要特征之一是它允许重用Java代码。 可以通过称为BaseLanguage的 MPS编写新的Java代码。 但是,有时我们只想在MPS中重用现有的Java代码。
在本教程中,我们将看到:
- 如何将JAR加载到MPS中
- 我们如何使用此功能解决一个常见问题:使用Java加载静态资源以在Jetbrains MPS代码中使用它们。
首先,我们将看到如何创建一个包含资源的新JAR,然后如何在Jetbrains MPS中加载现有的JAR。
您可以在配套存储库中找到该项目的源代码。
创建一个包含静态资源的JAR
我们将使用脚本gradle来创建JAR,因为它更方便且易于自动化,但是显然您可以按照自己喜欢的方式进行操作。
该项目的结构是传统的Java结构,具有resources
和src
目录。
gradle项目很简单,我们要做的就是创建具有以下内容的build.gradle
文件。
- apply plugin: 'java'
-
- sourceSets.main.resources.srcDirs = [ "resources/" ]
- sourceSets.main.resources.includes = [ "**/*.png", "**/*.gif" ]
我们所做的只是指示在哪里找到资源以及要包含的文件,在本例中为图标的图像文件。
Java类同样也很简单,我们将图标作为静态字段进行访问。
- 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项目的主目录并进行构建。
- # Linux/Mac OS/Cygwin
- ./gradlew jar
- # Windows
- ./gradlew.bat jar
最终结果应该是build/libs/
目录下的resources_project.jar 。
MPS项目
现在我们有了带有图标的JAR,我们必须使MPS代码可以访问它。 您可以对任何现有的JAR代码使用相同的过程。
我们更喜欢在自己的解决方案中导入静态资源,因为它可以使项目更清洁。 因此,我们首先创建一个名为com.strumenta.examples.external
的解决方案,该解决方案将生成一个具有该名称的目录和一个具有相同名称的.msd文件。 在该目录内还将有一个models
目录。 在com.strumenta.examples.external
目录内,我们手动添加一个libs
目录,并带有resources_project.jar
。
我们仍然必须通过转到模块属性( Alt + Enter
)将生成的库添加到模块:
- 在“依赖关系”选项卡中,我们添加了JDK模块,然后选择“导出”
- 在Java选项卡的Libraries部分中,我们添加JAR文件。 在MPS中,您会看到完整的路径,但是MPS在内部保存了相对路径,因为我们在解决方案目录中插入了JAR。 这非常重要,因为这意味着即使在其他机器上进行项目工作的其他贡献者也可以得到正确的结果
- 在“公共”选项卡中,单击“添加模型根目录”->“ java_classes”,然后在右侧面板中选择JAR文件,然后单击“
Sources
以将其内容添加到模型中
如果您的库需要第三方Java代码,则应针对依赖项执行步骤2和3。 在我们的案例中,我们确实使用了第三方代码(Javax Swing),但这是已经包含的JDK平台的一部分。 因此,我们无需执行其他任何操作。
在现实世界中,问题在于可能存在很多依赖关系,尤其是对于复杂项目。 因此,您可能希望首先使用标准工具(例如gradle或maven)收集所有依赖项,然后将其插入MPS。
如果现在打开ExampleIcons
文件,则应该看到类似于下图的内容。
如果您在ExamplesIcons中看到一些错误,则可能是您添加了错误的顺序。 您必须首先添加JDK模块,以便MPS可以自动添加所需的内容。 为了确认一切正常,您还可以查看icons@java_stub model
的Model Properties,它应该已经自动包含Java和Javax.Swing在其依赖项之间切换(您不能手动添加它们)。
要测试包含,您可以使用MPS控制台。 使用CTRL + M包含外部解决方案,然后尝试使用指令ExamplesIcons.MAIN.getDescription()
进行命令printText
,如下图所示。 然后按执行按钮:tt应该打印“ Main Icon”
基本上就是这样,您只需要记住在使用JAR中包含的代码的每个模块中都包含com.strumenta.examples.external
模块作为依赖项。 如果要使用插件或模拟器中的资源,则可能需要将其添加为运行时依赖项。
在构建模型中包含JAR
如果生成MPS的插件或自定义版本,则将使用构建模型。 在这种情况下,您应该在那些构建模型中添加JAR。
例如,如果生成插件,则必须将JAR复制到插件目录中,如下图所示。
如果您忘记这样做,则在尝试生成与插件构建相关的模型时会收到错误消息。
翻译自: https://www.javacodegeeks.com/2018/01/add-jars-jetbrains-mps-project.html