我有一个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
触发的,这看起来像是一个可能的原因,但这是我设法来的。
关于这里可能出错的任何想法?
答案 0 :(得分:0)
当您运行Acceleo standalone时,您必须为其提供插件运行的所有库/ jar和类。此外,如果要将其导出到jar,则还必须提供Eclipse的库。
我建议你使用maven / ant编译和生成jar(我已经使用过maven),因为你必须打包几个库,这样会更容易。
罐子列表(您可以从Eclipse中的plugins文件夹中获取几乎所有罐子):
也许你可能不得不将它们中的一些作为依赖项包含在你的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相关的内容,但它们肯定对您无用。
我希望我能帮到你!