0

我有一个 Acceleo 项目(一堆 *.mtl 文件和一个可以使用这些模板生成输出的 Java 类)。只要我从 Eclipse 内部运行该项目,它就可以正常工作,但是当我使用 Maven 编译 *.emtl 文件时,我会在里面得到一个 NullPointerException AcceleoService#doGenerate()

Thread [ModalContext] (Suspended (exception NullPointerException))  
    AcceleoService.doGenerate(Module, String, EObject, List<Object>, File, Monitor) line: 565   
    Plugin(AbstractAcceleoGenerator).generate(Monitor) line: 194    
    Plugin(AbstractAcceleoGenerator).doGenerate(Monitor) line: 159  
    Plugin.doGenerate(Monitor) line: 211    
    Plugin.main(String[]) line: 168 
    NewRPCServiceDefinitionWizard.generatePluginXml(IProgressMonitor) line: 450 
    NewRPCServiceDefinitionWizard.generateCode(IProgressMonitor) line: 269  
    NewRPCServiceDefinitionWizard.access$2(NewRPCServiceDefinitionWizard, IProgressMonitor) line: 231   
    NewRPCServiceDefinitionWizard$3$1.runInWorkspace(IProgressMonitor) line: 315    
    NewRPCServiceDefinitionWizard$3.run(IProgressMonitor) line: 321 
    ModalContext$ModalContextThread.run() line: 121 

有问题的代码如下所示:

    for (Template template : mainTemplates) {
        // Calls the template with each potential arguments
        final EClassifier argumentType = template.getParameter().get(0).getType();
        // !!! argumentType is null here !!!
        if (argumentType.eIsProxy()) {
            throw new AcceleoEvaluationException(AcceleoEngineMessages.getString(
                    "AcceleoService.TypeIsProxy", templateName)); //$NON-NLS-1$
        }

所以getType()返回null。由于这在 Eclipse 中有效,但在使用 Maven 构建时无效,我对生成*.emtl的文件进行了比较,发现*.emtl有效的文件位于顶部

<input>
    <takesTypesFrom href="http://mycompany.com/xyz#/"/>
</input>

而那个不工作的有

<input/>

由于 NPE 是由getType()返回触发的null,这看起来是一个可能的原因,但这是我设法做到的。

关于这里可能有什么问题的任何想法?

4

1 回答 1

0

当您独立运行 Acceleo 时,您必须为其提供插件为您运行的所有库/jar 和类。此外,如果要将其导出到 jar 中,还必须提供 Eclipse 的库。

我建议您使用 maven/ant(我使用过 maven)编译和生成 jar,因为您必须打包多个库,这样会更容易。

jar 列表(您可以从 Eclipse 的 plugins 文件夹中获取几乎所有的 jar):

在此处输入图像描述

也许您可能必须将其中一些作为依赖项包含在您的 pom 中,以便 maven 能够将它们包含在您的最终 jar 中。

最后,您必须像这样为 acceleo 配置插件:

            <configuration>
                <useBinaryResources>false</useBinaryResources>
                <usePlatformResourcePath>true</usePlatformResourcePath>
                <acceleoProject>
                    <root>${project.basedir}</root>
                    <entries>
                        <entry>
                            <input>your/source/package (ordinary: src/main)</input>
                            <output>your/target/package</output>
                        </entry>
                    </entries>
                </acceleoProject>
            </configuration>

如您所见,我已经导入了与 MoDisco 相关的东西,但它们肯定对您毫无用处。

我希望我能帮助你!

于 2014-11-13T16:19:53.780 回答