如何将 JAR 添加到 Jetbrains MPS 项目

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(201)   2024-06-10 06:20:09

Jetbrains MPS 是创建 DSL 的绝佳工具。我们喜欢它,并在我们的咨询工作中经常使用它。 所以我们之前写过关于 Jetbrains MPS 的文章

作为投影编辑器,您可以轻松创建可通过图形界面或数学公式等方式使用的 DSL。尽管所有这些功能都需要一些准备工作。

MPS 最重要的特性之一是它允许重用 Java 代码。新的 Java 代码可以通过所谓的 BaseLanguage 用 MPS 编写。但是,有时我们只想重用 MPS 中的现有 Java 代码。

在本教程中,我们将看到:

  1. 如何将 JAR 加载到 MPS 中
  2. 我们如何使用此功能解决一个常见问题:使用 Java 加载静态资源以在 Jetbrains MPS 代码中使用它们。

首先,我们将了解如何创建包含资源的新 JAR,然后如何在 Jetbrains MPS 中加载现有 JAR。

您可以在 companion repository 中找到该项目的源代码。

创建包含静态资源的 JAR

我们将使用脚本 gradle 来创建 JAR,因为它更方便并且可以轻松自动化,但显然您可以按照自己喜欢的方式进行。

该项目的结构是传统的 Java 结构,具有 resourcessrc 目录。

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) 将生成的库添加到模块中:

  1. 在 Dependencies 选项卡中,我们添加 JDK 模块,然后选择 Export 
  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 文件,您应该会看到类似于下图的内容。 如果您在 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 中包含的代码的每个模块中。如果您想在插件或模拟器中使用资源,您可能希望将其添加为运行时依赖项。

在构建模型中包含 JAR

如果您生成 MPS 的插件或自定义版本,您将使用构建模型。在那种情况下,您应该将 JAR 添加到那些构建模型中。例如,如果您生成一个插件,您必须将 JAR 复制到插件的目录中,如下图所示。

如果您忘记这样做,您将在尝试生成与插件构建相关的模型时收到错误消息。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-add-jars-jetbrains-mps-project.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...