在 liferay 6.1 sdk 中使用 ant 构建时出现内部编译器错误

Internal Compiler Error while building with ant in liferay 6.1 sdk

我尝试在 6.1.10 中编译 portlet 插件时遇到一个奇怪的问题。

第一版插件没有任何问题,在SVN中提交。我创建了这个插件的一个分支,并在 java 文件中做了一些更改,从那时起我就无法根据提示编译它(在 Liferay Studio 2 中。2.x 它编译正确)。

所以,现在我在同一个SDK中有同一个插件的两个版本,但是第一个版本编译没有问题,第二个版本有以下错误:

[javac] 1. ERROR in /XXXX/liferay-plugins-sdk-6.1.10-ee-ga1/portlets/XXXX-portlet/docroot/WEB-INF/src/XXXX/ObjectFactory.java (at line 0)
[javac]
[javac]     ^
[javac] Internal compiler error
[javac] java.lang.NullPointerException
[javac]     at org.eclipse.jdt.internal.compiler.ast.SingleTypeReference.getTypeBinding(SingleTypeReference.java:44)
[javac]     at org.eclipse.jdt.internal.compiler.ast.TypeReference.internalResolveType(TypeReference.java:130)
[javac]     at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:197)
[javac]     at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:193)
[javac]     at org.eclipse.jdt.internal.compiler.ast.Annotation.resolveType(Annotation.java:231)
[javac]     at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveAnnotations(ASTNode.java:594)
[javac]     at org.eclipse.jdt.internal.compiler.apt.dispatch.AnnotationDiscoveryVisitor.resolveAnnotations(AnnotationDiscoveryVisitor.java:143)
[javac]     at org.eclipse.jdt.internal.compiler.apt.dispatch.AnnotationDiscoveryVisitor.visit(AnnotationDiscoveryVisitor.java:131)
[javac]     at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.traverse(TypeDeclaration.java:1198)
[javac]     at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.traverse(CompilationUnitDeclaration.java:687)
[javac]     at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundEnvImpl.<init>(RoundEnvImpl.java:56)
[javac]     at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:148)
[javac]     at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:794)
[javac]     at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:423)
[javac]     at org.eclipse.jdt.internal.compiler.batch.Main.performCompilation(Main.java:3543)
[javac]     at org.eclipse.jdt.internal.compiler.batch.Main.compile(Main.java:1645)
[javac]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[javac]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[javac]     at java.lang.reflect.Method.invoke(Method.java:597)
[javac]     at org.eclipse.jdt.core.JDTCompilerAdapter.execute(JDTCompilerAdapter.java:79)

我检查了两个构建的 class 路径,除了插件文件夹的名称外,它们是相同的。由于他们在同一个 SDK 中构建,他们使用相同的 java、相同的编译器、门户等。java 版本是 1.6.0_65,但问题也可以在不同的环境中重现机器。

另外,编译失败的class在两个项目中是一样的

提前致谢。

看来liferay 6.1.10 SDK使用的是很老的ecj.jar(3.4.1版)。我从 ant lib 目录(由 liferay sdk 复制到那里)中删除了 ecj.jar,并将 sdk lib 目录的 ecj.jar 替换为 ecj 3.5.1。对于下一个 'ant war',新的 ecj.jar 被复制到 ant lib 目录中,并且对于 war 任务的另一个 运行,错误消失了。

另请参阅上述评论中的 eclipse bugzilla 中的错误。