NPE运行Acceleo发电机

时间:2014-10-07 08:52:40

标签: eclipse acceleo

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

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触发的,这看起来像是一个可能的原因,但这是我设法来的。

关于这里可能出错的任何想法?

1 个答案:

答案 0 :(得分:0)

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

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

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

enter image description here

也许你可能不得不将它们中的一些作为依赖项包含在你的pom中,以便maven能够将它们包含在你的最后一个jar中。

最后,你必须像这样配置你的加速器插件:

            <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相关的内容,但它们肯定对您无用。

我希望我能帮到你!