Jetbrains MPS 是创建 DSL 的绝佳工具。我们喜欢它,并在我们的咨询工作中经常使用它。 所以我们之前写过关于 Jetbrains MPS 的文章。
作为投影编辑器,您可以轻松创建可通过图形界面或数学公式等方式使用的 DSL。尽管所有这些功能都需要一些准备工作。
MPS 最重要的特性之一是它允许重用 Java 代码。新的 Java 代码可以通过所谓的 BaseLanguage 用 MPS 编写。但是,有时我们只想重用 MPS 中的现有 Java 代码。
在本教程中,我们将看到:
首先,我们将了解如何创建包含资源的新 JAR,然后如何在 Jetbrains MPS 中加载现有 JAR。
您可以在 companion repository 中找到该项目的源代码。
我们将使用脚本 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。
现在我们有了带有图标的 JAR,我们必须让 MPS 代码可以访问它。您可以对现有的任何 JAR 代码使用相同的过程。
我们更喜欢在他们自己的解决方案中导入静态资源,因为它使项目更干净。因此,我们首先创建一个名为 com.strumenta.examples.external
的解决方案,它会生成一个具有该名称的目录和同名的 .msd 文件。目录内还有一个 models
目录。在 com.strumenta.examples.external
目录中,我们手动添加一个 libs
目录,其中包含我们的 resources_project.jar
。
我们仍然需要通过转到模块属性 (Alt + Enter
) 将生成的库添加到模块中:
Sources
将其内容添加到模型 如果您的库需要第三方 Java 代码,您应该为您的依赖项执行步骤 2 和 3。在我们的例子中,我们确实使用了第三方代码 (Javax Swing),但它是已经包含的 JDK 平台的一部分。因此,我们不需要做任何其他事情。
在现实世界的场景中,问题在于可能存在很多依赖关系,尤其是对于复杂的项目。因此,您可能希望首先使用标准工具(如 gradle 或 maven)收集所有依赖项,然后将它们插入 MPS。如果您现在打开 ExampleIcons
文件,您应该会看到类似于下图的内容。 如果您在 ExamplesIcons 中看到一些错误,您可能以错误的顺序添加了东西。您必须先添加 JDK 模块,以便 MPS 可以自动添加所需的内容。为确认一切正常,您还可以查看 icons@java_stub model
的模型属性,它应该已自动将 Java 和 Javax.Swing 包含在其依赖项中(您不能手动添加它们)。
要测试包含,您可以使用 MPS 控制台。使用 CTRL+M 包含外部解决方案,然后使用指令 printText
尝试命令 ExamplesIcons.MAIN.getDescription()
,如下图所示。然后按 Execute 按钮:tt 应该打印“Main Icon”
基本上就是这样,您只需要记住将模块 com.strumenta.examples.external
作为依赖项包含在您使用 JAR 中包含的代码的每个模块中。如果您想在插件或模拟器中使用资源,您可能希望将其添加为运行时依赖项。
如果您生成 MPS 的插件或自定义版本,您将使用构建模型。在那种情况下,您应该将 JAR 添加到那些构建模型中。例如,如果您生成一个插件,您必须将 JAR 复制到插件的目录中,如下图所示。
如果您忘记这样做,您将在尝试生成与插件构建相关的模型时收到错误消息。
标签2: Java教程地址:https://www.cundage.com/article/jcg-add-jars-jetbrains-mps-project.html