如何将JAR添加到Jetbrains MPS项目

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

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

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

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

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

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

您可以在配套存储库中找到该项目的源代码。

创建一个包含静态资源的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. 在“依赖关系”选项卡中,我们添加了JDK模块,然后选择“导出”
  2. 在Java选项卡的Libraries部分中,我们添加JAR文件。 在MPS中,您会看到完整的路径,但是MPS在内部保存了相对路径,因为我们在解决方案目录中插入了JAR。 这非常重要,因为这意味着即使在其他机器上进行项目工作的其他贡献者也可以得到正确的结果
  3. 在“公共”选项卡中,单击“添加模型根目录”->“ 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 3实现k-邻近算法以及 iris 数据集分类应用

前言 这个周基本在琢磨这个算法以及自己利用Python3 实现自主编程实现该算法。持续时间比较长,主要是Pyhton可能还不是很熟练,走了很多路,基本是一边写一边学。不过,总算是基本搞出来了。不多说,进入正题。 1. K-邻近…

spring mvc 异步_DeferredResult – Spring MVC中的异步处理

spring mvc 异步DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供。 Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContext异步请求处理。 简要介绍一下它是如何工作的: RequestMapping("/") ResponseBod…

切换表达式到Java吗?

已创建一个标题为“ Java语言的开关表达式”的JEP草案 。 当前的“摘要”状态为:“扩展switch语句,以便可以将其用作语句或表达式,并改善switch处理null的方式。 这些将简化日常编码,并为在switch使用模式匹配做好准备。” 除了启…

WildFly Kubernetes exec探针

活动和就绪探针会告诉Kubernetes吊舱是否正在运行并准备进行一些工作。 企业应用程序可以通过HTTP探测应用程序的状态。 如果没有暴露HTTP端点,Kubernetes也可以通过执行命令进行探测。 WildFly附带了有用的jboss-cli.sh 。 此CLI检索有关服务器和部署状态的信息&a…

FPGA硬件学习基础知识点总结(1)

FPGA硬件学习基础知识点总结(1)锁存器与触发器 总结一下数电,FPGA的一些基础知识,涉及到硬件电路的设计。主要是记录自己的学习过程。 锁存器与触发器 锁存器(latch):锁存器是电平触发的存储单…

ejb java_EJB继承与Java继承不同

ejb java尽管EJB继承有时使用Java继承,但事实并非总是如此。 就像您在我以前的文章中可以读到的那样 ,EJB不必实现任何接口即可公开业务接口。 反之亦然-仅仅是因为EJB实现了某个接口或扩展了其他EJB,并不意味着它公开了全部或任何视图。 假…

UART原理

UART原理 通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片&am…

Java 9:流API的增强

Java 9向Stream接口添加了4种新方法: 1. dropWhile dropWhile方法类似于skip方法,但使用Predicate而不是固定的整数值。 当Predicate为true时,它将从输入流中删除元素。 然后将所有剩余的元素传递到输出流。 例如: IntStream.ra…

AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题

新人tensorflow2.1版本导致程序我无法运行最简单的办法 法1 tensorflow.compat.v1 import tensorflow.compat..v1 as tf tf.disable_v2_behavior() 亲测不好用 法2 卸载2.1,安装老版本 在Terminal界面输入 pip uninstall tensorflow接着输入Y确定卸载。 安装t…

正则表达式 guava_带有正则表达式模式的Google Guava Cache

正则表达式 guava最近我看到了一个关于Google Guava的不错的介绍 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣。 让我们看一下regexp Pattern类及其编译功能 。 在代码中我们经常可以看到,每次使用正则表达式时,程序…

word中一直提示校对错误,如何关闭当前文档校对功能

关闭当前文档校对功能 文件>选项>校对>例外项,选中两个,如图 对比效果:

微信小程序开发学习记录01

微信小程序结构 根目录 app.js:小程序逻辑文件(必须) app.json:小程序配置文件(必须) app.wxss:全局公共样式文件(非必须) pages 组成小程序的多个页面&#xff0c…

Java Optionals获得更具表现力的代码

我们中任何人使用允许空引用的语言进行编程时,都会遇到尝试取消引用一个引用时发生的情况。 无论是导致segfault还是NullPointerException,它始终是一个错误。 托尼霍尔将其描述为他十亿美元的错误 。 当函数向客户端的开发人员未预料到的客户端返回空引…

Atom使用方法(快捷键,插件,汉化)

Atom文本编辑软件 使用方法 常用快捷键 Ctrl Shift M :打开markdown调试窗口 Crtl m:相应括号之间,html tag之间等跳转 Crtl Alt B: 格式化代码(需要安装atom-beautify) Crtl :调起CLI…

将测微仪与Spring Boot 2一起使用

这是快速入门,介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在各种监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例,如果我要将Java应用程序与Prometheus集成&#…

学习笔记整理

毕设学习笔记整理说明Python和Pycharm使用方面因网络问题导致pycharm安装第三方库失败的解决办法将python程序打包为exe程序pyinstallerpy2exepycharm取消缩进Python函数方面python中 if __name__ __main__: 的作用与意义cv2.resize的用法只读取图像的单通道数值最值索引图像增…

与Maven的集成测试

用Maven实施单元测试是很普通的事情,我们大多数人都熟悉项目结构以及单元测试所在的位置。 但是,集成测试是一种不同的情况,大多数情况下它们具有完全不同的要求。 例如,可以让您的单元测试在内存数据库中的h2上运行,…

通信原理-通信系统的组成

第一章 通信系统的组成 1、通信系统一般模型 发送设备:将信源产生的原始电信号变换成适合在信道中传输的形式。变换方式有调制、放大、滤波、编码、多路复用等。 信道:传输信号的通道.即传输媒质。在给子信号通道的同时,信道也会对信号产生损…

使用log4j2免费分配日志记录

介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:) 我应该使用哪个框架进行GC…

Verilog中fork...join 的用法

特点 中间的语句并行执行;(延时不累加) 不能用于综合; 代码 module signal_gen; reg wave; parameter cycle 5; initial beginforkwave 0;#(cycle) wave 1;#(2*cycle) wave 0;#(3*cycle) wave 1;#(4*cycle…