独立的ecj(Eclipse Java Compiler)软件包不再维护了吗?

3
我们的项目中使用了来自org.eclipse.jdt.core.compiler的ecj,但是看起来这个包从2016年10月7日以来就没有更新了。它不再维护了吗?

enter image description here

我应该切换到ecj还是继续使用org.eclipse.jdt?看起来版本号(3.20.0)比前者4.6.1要旧?


1
那是什么网站?Eclipse 2019-12项目下载的官方网站在这里。这是昨天发布的新版本,包括一个独立的ecj。 - greg-449
这是网站链接:https://search.maven.org/ - Gelin Luo
2个回答

3
ecj在Maven中的官方坐标确实是:org.eclipse.jdt:ecj
正如您所看到的,自3.12.3(对应Neon.3)以来,所有发行版本都存在这个构件。
其他组中的构件可能会错误地使用Eclipse发行版的版本号,而不是ecj本身的版本号,因此即使它们很旧,也会显示为更新的版本。
(当Eclipse SDK从3.x升级到4.x时,这是由于代码UI部分的破坏性变化。然而,ecj仍然兼容,因此保持在3.x)
如果有疑问,请运行以下命令查看ecj的真实版本:
$ java -jar ecj.jar -version

最新版本将解答。
Eclipse Compiler for Java(TM) v20191203-2131, 3.20.0, Copyright IBM Corp 2000, 2015. All rights reserved.

0

这将随着Eclipse 4.27(2023年03月发布)而改变:

ECJ从JDT Core中分离出来

历史上,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捆绑包以及对工作区的依赖。
  • 将ECJ代码与IDE代码放在同一个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产品中使用。

然而,没有变化是没有副作用的。

ECJ从核心捆绑包中分离的已知问题

  • 作为org.eclipse.jdt.core.compiler.batch代码从org.eclipse.jdt.core中分离出来的一部分,org.eclipse.jdt.core的两个片段-org.eclipse.jdt.compiler.aptorg.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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接