将Xtext Eclipse项目移植到Maven

问题描述 投票:0回答:2

我正在尝试将现有的 Xtext 2.21.0 项目从 Eclipse 2020-03 移植到 Maven。

我使用 Eclipse 生成了一个示例 Xtext Maven 项目,然后用我的 DSL 填充它。问题是我的语法找不到对其他语法的引用。

529  ERROR XtextGeneratorLanguage - [XtextLinkingDiagnostic: null:1 Couldn't resolve reference to Grammar 'abc.generator.ServiceGenerator'., XtextLinkingDiagnostic: null:4 Couldn't resolve reference to EPackage 'http://www.generator.abc/ServiceGenerator'., XtextLinkingDiagnostic: null:117 STRING cannot be resolved to a rule, XtextLinkingDiagnostic: null:249 INT cannot be resolved to a rule, TransformationDiagnostic: null:248 Datatype rules may only use other datatype rules, lexer rules and keywords. (ErrorCode: InvalidDatatypeRule)]
531  ERROR Mwe2Launcher       - Problems running workflow abc.generator.GenerateRawNotificationGenerator: Problem parsing 'file:/C:/Users/xxx/Desktop/eclipse_plugin_pom/abc.generator/../abc.generator/src/abc/generator/VarDefinitionGenerator.xtext':
XtextLinkingDiagnostic: null:1 Couldn't resolve reference to Grammar 'abc.generator.ServiceGenerator'.
XtextLinkingDiagnostic: null:4 Couldn't resolve reference to EPackage 'http://www.generator.abc/ServiceGenerator'.
XtextLinkingDiagnostic: null:117 STRING cannot be resolved to a rule
XtextLinkingDiagnostic: null:249 INT cannot be resolved to a rule
TransformationDiagnostic: null:248 Datatype rules may only use other datatype rules, lexer rules and keywords. (ErrorCode: InvalidDatatypeRule)

POM 文件只是 Eclipse Xtext 2.21.0 默认生成的 POM,唯一的修改是我的项目名称和 URI。

Mwe2 文件:

module abc.generator.GenerateRawNotificationGenerator

import org.eclipse.xtext.xtext.generator.*
import org.eclipse.emf.mwe.utils.StandaloneSetup
import org.eclipse.xtext.xtext.generator.model.project.*

var rootPath = ".."

Workflow {
    
    component = XtextGenerator 
    {
        configuration = 
        {
            project = StandardProjectConfig 
            {
                baseName = "abc.generator"
                rootPath = rootPath
                runtimeTest = 
                {
                    enabled = true
                }
                
                eclipsePlugin = 
                {
                    enabled = true
                }
                
                eclipsePluginTest = 
                {
                    enabled = true
                }
                
                createEclipseMetaData = true
            }
            code = 
            {
                encoding = "windows-1252"
                lineDelimiter = "\r\n"
                fileHeader = "/*\n * generated by Xtext \${version}\n */"
            }
        }
        
        language = StandardLanguage 
        {
            name = "abc.generator.ServiceGenerator"
            fileExtensions = "services"

            serializer = 
            {
                generateStub = false
            }
            
            validator = 
            {
                composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
            }
        }

        language = StandardLanguage 
        {
            name = "abc.generator.VarDefinitionGenerator"
            fileExtensions = "vardefinition"

            serializer = 
            {
                generateStub = false
            }
            
            validator = 
            {
                composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
            }
        }
    }
}

ServiceGenerator 标头:

grammar abc.generator.ServiceGenerator with org.eclipse.xtext.common.Terminals
generate serviceGenerator "http://www.generator.abc/ServiceGenerator"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

VarDefinitionGenerator 标头:

grammar abc.generator.VarDefinitionGenerator with abc.generator.ServiceGenerator
generate varDefinitionGenerator "http://www.generator.abc/VarDefinitionGenerator"

import "http://www.generator.abc/ServiceGenerator"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

我必须提到我对 Xtext 一点也不熟悉,但我对 Maven 很熟悉。 该项目在 Eclipse 2020-03 中运行良好,但由于 Eclipse 存在错误,我们需要摆脱它。我尝试升级到 Eclipse 2023-09、Java 17 和 Xtext 2.32.0,但项目无法正常工作(一些注入的变量返回为 null)。

我不明白的是Eclipse的plugin.xml文件是否应该添加到mwe2文件中的某个位置。

<?xml version="1.0" encoding="windows-1252"?>
<?eclipse version="3.0"?>
<plugin>
    <extension point="org.eclipse.emf.ecore.generated_package">
        <package 
            uri = "http://www.generator.abc/ServiceGenerator"
            class = "abc.generator.serviceGenerator.ServiceGeneratorPackage"
            genModel = "model/generated/ServiceGenerator.genmodel" />
    </extension>
    <extension point="org.eclipse.emf.ecore.generated_package">
        <package 
            uri = "http://www.generator.abc/VarDefinitionGenerator"
            class = "abc.generator.varDefinitionGenerator.VarDefinitionGeneratorPackage"
            genModel = "model/generated/VarDefinitionGenerator.genmodel" />
    </extension>
</plugin>
eclipse maven xtext
2个回答
0
投票

你可以用第二种语言讲述第一种语言

language = StandardLanguage {
    referencedResource="platform:/resource/<project>/src/<PathTo>/<ParentDsl>.xtext"

0
投票

我找到了解决办法。看来xtext Maven有一个bug,通过将src目录添加到

additionalClasspathElements
来解决。

通过这样做,您不再需要在

referencedResource
文件中定义多个
.mwe2


<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.0.0</version>
    ...
    <configuration>
        <mainClass>org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher</mainClass>
        ...

        <additionalClasspathElements>
            <additionalClasspathElement>${project.basedir}/src</additionalClasspathElement>
        </additionalClasspathElements>
    </configuration>

非常感谢这里解决方案的贡献者:https://github.com/eclipse/xtext/issues/2394#issuecomment-1511031257

我通过首先在

referencedResource
文件中为每种语言定义多个
.mwe2
意外地发现了它,但这导致了另一个 PDA 错误,从而使我找到了这两个问题的正确解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.