ecj
在Maven中的官方坐标确实是:org.eclipse.jdt:ecj
。3.12.3
(对应Neon.3)以来,所有发行版本都存在这个构件。ecj
的真实版本:$ java -jar ecj.jar -version
Eclipse Compiler for Java(TM) v20191203-2131, 3.20.0, Copyright IBM Corp 2000, 2015. All rights reserved.
这将随着Eclipse 4.27(2023年03月发布)而改变:
历史上,ECJ的代码始终在同一个org.eclipse.jdt.core
项目中,该项目还包含IDE中Java支持的代码,只是在不同的源文件夹中。
众所周知,独立的ECJ编译器库可以在Eclipse之外使用(用于与外部工具一起编译),它是在构建时从此核心捆绑包中生成的,并未包含在默认SDK中(因为它包含了org.eclipse.jdt.core
提供的子集包和类)。
这导致了一些问题,无论是在Eclipse / 独立使用ECJ编译器都会出现问题。
javax.tools.JavaCompiler
API实现但不需要完整的JDT /工作区支持的Eclipse内部(非JDT)代码无法使用org.eclipse.jdt.core
而不拉入org.eclipse.core.resources
捆绑包以及对工作区的依赖。org.eclipse.jdt.core
捆绑包中的另一个有趣的副作用是开发人员无法看到ECJ代码是否错误地依赖于IDE。为了解决这些(和其他)问题,ECJ代码从org.eclipse.jdt.core移动到专用的org.eclipse.jdt.core.compiler.batch
项目中,并将作为单独的捆绑包部署。
org.eclipse.jdt.core.compiler.batch
现在作为常规Eclipse捆绑包包含在SDK中,可以与org.eclipse.jdt.core bundle
分别编译/部署/使用。
所有ECJ包都由org.eclipse.jdt.core
重新导出,因此从OSGI的角度来看,所有使用org.eclipse.jdt.core
的某些编译器相关API的第三方代码不需要任何更改。
org.eclipse.jdt.core.compiler.batch
捆绑包本身没有任何依赖关系,因此可以在不使用工作区概念的Eclipse产品中使用。
然而,没有变化是没有副作用的。
作为org.eclipse.jdt.core.compiler.batch
代码从org.eclipse.jdt.core
中分离出来的一部分,org.eclipse.jdt.core
的两个片段-org.eclipse.jdt.compiler.apt
和org.eclipse.jdt.compiler.tool
被合并到org.eclipse.jdt.core.compiler.batch
中。
因此,如果某个目标定义、启动配置或构建文件引用了这两个片段,则现在可以和应该删除这些引用。
另一个问题可能会影响使用org.eclipse.jdt.core
作为“简单”Java库(jdt.core
从未是)的独立(非OSGI基础)应用程序。
例如,在类路径上有org.eclipse.jdt.core_XYZ.jar
并尝试在Eclipse之外调用以下代码:
ASTParser parser = ASTParser.newParser(AST.getJLSLatest());
现在将失败:
NoClassDefFoundError: org.eclipse.jdt.internal.compiler.env.ICompilationUnit
因为org.eclipse.jdt.core.dom.AST