问题标签 [ecj]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1875 浏览

generics - Java 8 泛型方法...不适用于 Eclipse 中的参数

在我们的代码库从 java 1.7 迁移到 1.8 期间,我们在多个代码位置收到错误消息“方法...不适用于参数”,所有这些都遵循泛型使用的相同模式。

我们目前主要使用Eclipse Mars(4.5.2) on ,但也可以使用(4.6)Windows 7来确认行为。以及1.7 合规级别都可以编译我们的代码而不会出错。NeonJavacecj

这是一个最小、完整和可验证的示例:

现在切换方法中注释掉的行doSomething可以编译代码,所以我们确实有一个解决方法。仍然错误消息似乎不正确,因为类SubFooBar扩展Foo并实现Bar了,所以它履行了 的合同<T extends Foo & Bar>,这是在 中要求的<T extends Foo & Bar> FooBar<T> makeFooBar(),所以实际上TIMO 应该绑定到SubFooBar

我搜索了类似的问题并发现了这些: Differences in type inference JDK8 javac/Eclipse Luna? 类型推断编译器错误在 Eclipse 中使用 Java8 但不是 Java7

这让我觉得这可能是一个ecj错误。在这门课程中,我也研究了Eclipse Bugzilla但找不到任何可比的东西,我看到了这些:

  • 430686 已验证修复 - 我的不是
  • 440019 与标量类型有关 - 我的不是
  • 492838、448793 与通配符有关——我的不是

现在Eclipse Bugzilla讨论中充满了关于 . 内部运作的细节ecj,我并不总是能理解。我所理解的是那里的普遍共识,Eclipse编译器必须严格遵循JLS而不是javac(在错误的情况下),所以它不一定是ecj. 如果它不是一个ecj错误,那么编译代码一定是一个javac错误。

我感兴趣的是——对于那些可以分析我的代码片段的类型推断过程的人——代码应该已经编译还是我在编码时出错了?

编辑

正如我承诺将我的报告结果发布到 Eclipse 的那样Bugzilla:该缺陷的 ID 为 #497905(Stephan Herrmann 在他的评论中发布了已接受答案下方的链接),目前针对 v4.7。

0 投票
1 回答
1330 浏览

java - 在 Eclipse 中创建 ecj.jar 文件

elipse.jdt.core为了支持类似于 Java 的语言 (MaxJ),我对插件进行了一些更改。我所做的更改可以在这里找到:

https://github.com/maxeler/eclipse.jdt.core/tree/MAXJ_4_4_maintenance

我的插件的发布可以在这里找到:

https://github.com/maxeler/eclipse/releases

当我在 GUI 模式下使用 eclipse 时一切正常,但我想从命令行编译不同的项目(在无头构建或使用 ant 中),为此我需要创建新ecj.jar文件。我尝试构建这个库:

https://github.com/maxeler/maxpower

根据这篇文章:

http://help.eclipse.org/kepler/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-ant_javac_adapter.htm

jdtCompilerAdapter.jar可以用来代替,ecj.jar但这不起作用,因为它不包含编译器类(如CompilerOptions等)。在build.xml文件中,我更改了以下几行:

有了这个:

然后我运行这个命令开始构建过程:

它产生以下错误:

目前,似乎唯一的选择是构建一个新ecj.jar文件,但我找不到这样做的方法。

0 投票
2 回答
697 浏览

java - Should JDK 9 not allow Lambda Expression instantiation where final fields are referenced in the overridden method?

I've been working with the new Eclipse Neon and some of my code started to give me errors straight away.
This was strange to me at first, but then I found here that the Neon ECJ(Eclipse Java Compiler) adopts the attitude of the JDK 9 early release compiler.
I do not encounter the same issue that is in that link, but rather another that I will explain here.

Issue with Lambda Expression declarations as fields

Here is a test class that gives me a compilation error in Eclipse Neon, the JDK 9 compiler, and the JDK 8 compiler (Not previous versions of Eclipse though).

Given the code above, the errors at line 4 for suffix are:

Now see what happens with the same class if I move the suffix field declaration before the the addSuffix declaration.

Given the code above, the errors at line 6 for suffix are:

          Should Java 9 behave this way?

This worked perfectly fine in JDK 8; seems like a strange thing to suddenly enforce. Especially considering that there are already compile-time checks in place to ensure final fields are instantiated correctly.
Therefore, by the time the function addSuffix is ever accessed, there would need to be a value in place for suffix (null or otherwise is another story).

I'll also note that I've tried the following code, which compiles fine with JDK9 and ECJ:

It appears that in JDK 9, there is a big difference between anonymous class declarations and Lambda expressions. So in this case where we get a compiler error, at least the ECJ is accurately in mimicking the JDK 9 compiler.


Issue with Stream & Generics

This one really surprised me, because I cannot think of why the compiler would interpret this any differently than what the Generic in the code indicates:

This code gives these errors:

In light of this information, it appears in this case, the ECJ is at fault for not properly mimicking the JDK 9 and is just an Eclipse bug.

0 投票
2 回答
567 浏览

java - 为什么 javac 需要引用类的接口,而 ECJ 不需要?

0 投票
1 回答
596 浏览

java - Eclipse JDT 编译器说方法未定义,但 Eclipse IDE 没有

我正在使用一个名为 iText 的库(使用 JAR 文件添加到项目中)。它的 API 可以在这里看到:https ://coderanch.com/how-to/javadoc/itext-2.1.7/com/lowagie/text/Image.html

在我的项目中,我有一个名为 的简单 Java 文件,Worker.java它使用了这个库:

在上面的代码中,使用该函数Image检索对象的高度。img.getHeight()此函数是com.lowagie.text.RectangleImage 类扩展的类的一部分。

在 Eclipse 中编译此代码时,IDE 很快识别出该函数来自Rectangle该类并编译没有任何错误。

但是,如果我使用独立ecj-4.4.jar文件通过批处理编译器(BatchCompiler.compile(...))编译项目,编译器会报告以下错误:

我只是无法弄清楚为什么会抛出这个错误。如果这是一个真正的错误,那么为什么 Eclipse 不报告它呢?

编辑:类路径中有这个 JAR 的两个版本,这就是错误似乎出现的原因。不幸的是,由于这是一个多人参与的大型项目,我无法从项目中删除重复的 JAR。但是,Eclipse IDE 在为该方法查找正确的 JAR 时似乎没有任何问题,那么为什么编译器会出现这个问题呢?

0 投票
1 回答
2268 浏览

eclipse - Gradle:如何通过运行 Gradle 4.1 任务通过 Eclipse ECJ(JDT 核心)编译 Java

我有一个可以通过eclipse (ECJ)很好地构建的项目,但是Oracle javac无法构建它(某些原因,如链接:ecj 和 javac 的不同)。我想从 eclipse 转移到 Gradle 构建,以便 Jenkins 可以运行 Gradle 脚本。但是 Gradle 总是使用 javac 来编译。我使用插件'eclipse,eclipse-wtp'或库,jdt的依赖配置gradle使用ECJ,但它仍然不使用ECJ编译:

问题:我不知道使用 Eclipse Compiler (ECJ) 编译我期望的类的方式(没有文档,有些方法但旧 gradle 过期或不正确) gradle 4.1 运行任务。

注意:当我通过 javac 构建时出现此错误:与 javac 不兼容的类型。我想通过 ECJ 的任务 gradle 运行良好。

0 投票
0 回答
77 浏览

eclipse - 没有统一编码文件的 jdt 批处理编译器

我想在ant中使用jdt编译器来编译我的项目,但是项目没有统一文件,所以我尝试使用home doc encoding flag:批处理编译器用法

下面的代码:

当我运行这个任务时,它会显示错误:
D:\src\test\Test.java 中的错误
public class Test {

类型 Test 已经定义。

如何在每个文件中设置不同的编码?路径错了吗?

0 投票
0 回答
81 浏览

java - 空对象的实例方法引用

methodReferenceOfNullObject()调用时根据 JLS 的正确行为是什么?

  • 抛出一个NullPointerException(Oracle Java 编译器)或
  • 将供应商分配给result虽然onull(Eclipse Java 编译器)

    /li>
0 投票
2 回答
219 浏览

java - 此代码使用 ecj 而不是 javac 编译。这是 ecj、javac 中的错误还是两者都没有?

下面的代码创建一个Collector产生一个UnmodifiableSortedSet

代码在 ecj 编译器下编译:

然而,在 javac 下:

如果我将违规行更改为以下内容,则代码将在两个编译器下编译:

这是 ecj、javac 中的错误还是允许这两种行为的规范不足?

Javac 在 java 9 和 10 中的行为相同。

0 投票
1 回答
270 浏览

java - 当导入的类扩展第 3 方库时,Java 导入静态失败

问题设置由三个 java 库组成(为了便于阅读,我删除了所有包名,到处都使用全限定名):

  1. external-lib:提供抽象类

    /li>
  2. my-lib-A:提供类

    external-lib在 my-lib-A 的类路径中。

  3. my-lib-B 从 ClassA 静态导入 FOO:

    my-lib-A在 my-lib-B 的类路径external-lib中,但不在。

问题:该import static行产生以下错误:

The type AbstractExternal cannot be resolved. It is indirectly referenced from required .class files.

但是(1),当将 ClassB 修改为

编译器很高兴。

但是(2),当添加第二个抽象时,两个 my-lib-A 之类的

上面示例中 ClassA.FOO 的静态导入有效。

问题1:为什么在使用作品时会import static ClassA.FOO失败?import ClassAClassA.FOO

问题 2:为什么import static ClassA.FOO当它从 my-lib-A 扩展另一个类然后扩展 AbstractExternal 时会起作用?

编辑:重要信息:有问题的编译器是Eclipse Compiler for Java (ECJ)。

编辑 2:javac 与 ECJ 同步,并且能够在静态导入失败时编译 ClassB 中的正常导入和类访问。