“groovy-eclipse-compiler”编译正常,但javac编译失败。

huangapple go评论72阅读模式
英文:

groovy-eclipse-compiler compiles but javac compilation fails

问题

以下是您提供的内容的翻译:

我的项目使用groovy-eclipse-compiler可以成功构建,但是在没有使用groovy-eclipse-compiler(只使用javac)的情况下构建失败。构建失败时会出现如下的错误信息(在一个测试类中报告,模拟调用时出现):

java: 对getFileResource的引用不明确

为了调试这个问题,我创建了一个包含最少文件的项目(如下所示)。尽管在项目中我们也有Groovy源代码,但我在这里没有包含它们,以保持代码的简洁性。代码也已经推送到了Git,并且可以在 https://github.com/kaushalkumar/project-debug 找到。

我的疑问:报告的问题看起来是合理的,我认为groovy-eclipse-compiler也应该失败,但似乎这个错误被忽略了。我试图理解是什么让Groovy编译器忽略了它。这是Groovy编译器的问题吗?

src/main/java/pkg1/IStrategy.java
package pkg1;

import java.util.Map;

public interface IStrategy {
	Map<String, Object> getEnvMap();
}

src/main/java/pkg1/SharedResourceHelper.java
package pkg1;

import java.io.File;
import java.io.IOException;
import java.util.Map;

public class SharedResourceHelper {
	public static File getFileResource(final String resourceName, final IStrategy strategy) throws IOException {
      return getFileResource(resourceName, strategy.getEnvMap());
	}
	public static File getFileResource(final String resourceName, final Map<String, Object> envConfig) throws IOException {
      return null;
	}
}

src/test/java/pkg1/StrategyTest.java
package pkg1;

import pkg1.SharedResourceHelper;
import org.easymock.EasyMock;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.junit.Test;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.runner.RunWith;
import java.io.File;

@PrepareForTest({SharedResourceHelper.class})
@RunWith(PowerMockRunner.class)
public class StrategyTest {
	@Test
	@PrepareForTest({SharedResourceHelper.class})
	public void testGetFileResource() throws Exception {
      PowerMock.mockStatic(SharedResourceHelper.class);
      EasyMock.expect(SharedResourceHelper.getFileResource(EasyMock.anyString(), EasyMock.anyObject())).andReturn(File.createTempFile("tmp", "s"));
//      EasyMock.expect(SharedResourceHelper.getFileResource("test", null)).andReturn(File.createTempFile("tmp", "s"));
      
	}
}

/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>project.debug</groupId>
  <artifactId>project</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-easymock</artifactId>
      <version>2.0.7</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>2.0.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <compilerId>groovy-eclipse-compiler</compilerId>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-eclipse-compiler</artifactId>
            <version>2.9.2-01</version>
          </dependency>
          <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-eclipse-batch</artifactId>
            <version>2.4.3-01</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>
  • Java版本 - 1.8.0_231
  • Maven - 3.6.2
  • 操作系统 - Mac 10.15.6
  • groovy-eclipse-compiler版本 - 2.9.2-01
  • groovy-eclipse-batch版本 - 2.4.3-01
英文:

My project builds successfully with groovy-eclipse-compiler, but fails without groovy-eclipse-compiler (using just javac). The build fails with an error message as given below (reported in a test class, while mocking an invocation)

java: reference to getFileResource is ambiguous

In order to debug the issue, I created a project with minimal files (given below). Though in project we have groovy source also, but I have not included them here to keep the code minimal.
The code is also pushed to git and is available at https://github.com/kaushalkumar/project-debug

My Doubt: The reported issue looks to be legitimate and I feel that groovy-eclipse-compiler must also fail, but it seems that the error is ignored. I am trying to understand what make groovy compiler to ignore it. Is it an issue in groovy compiler?

src/main/java/pkg1/IStrategy.java
package pkg1;

import java.util.Map;

public interface IStrategy {
	Map&lt;String, Object&gt; getEnvMap();
}

src/main/java/pkg1/SharedResourceHelper.java
package pkg1;

import java.io.File;
import java.io.IOException;
import java.util.Map;

public class SharedResourceHelper {
	public static File getFileResource(final String resourceName, final IStrategy strategy) throws IOException {
      return getFileResource(resourceName, strategy.getEnvMap());
	}
	public static File getFileResource(final String resourceName, final Map&lt;String, Object&gt; envConfig) throws IOException {
      return null;
	}
}

src/test/java/pkg1/StrategyTest.java
package pkg1;

import pkg1.SharedResourceHelper;
import org.easymock.EasyMock;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.junit.Test;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.runner.RunWith;
import java.io.File;

@PrepareForTest({SharedResourceHelper.class})
@RunWith(PowerMockRunner.class)
public class StrategyTest {
	@Test
	@PrepareForTest({SharedResourceHelper.class})
	public void testGetFileResource() throws Exception {
      PowerMock.mockStatic(SharedResourceHelper.class);
      EasyMock.expect(SharedResourceHelper.getFileResource(EasyMock.anyString(), EasyMock.anyObject())).andReturn(File.createTempFile(&quot;tmp&quot;, &quot;s&quot;));
//      EasyMock.expect(SharedResourceHelper.getFileResource(&quot;test&quot;, null)).andReturn(File.createTempFile(&quot;tmp&quot;, &quot;s&quot;));
      
	}
}

/pom.xml

&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;project.debug&lt;/groupId&gt;
  &lt;artifactId&gt;project&lt;/artifactId&gt;
  &lt;packaging&gt;jar&lt;/packaging&gt;
  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.powermock&lt;/groupId&gt;
      &lt;artifactId&gt;powermock-api-easymock&lt;/artifactId&gt;
      &lt;version&gt;2.0.7&lt;/version&gt;
      &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.powermock&lt;/groupId&gt;
      &lt;artifactId&gt;powermock-module-junit4&lt;/artifactId&gt;
      &lt;version&gt;2.0.7&lt;/version&gt;
      &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
        &lt;version&gt;3.3&lt;/version&gt;
        &lt;configuration&gt;
          &lt;compilerId&gt;groovy-eclipse-compiler&lt;/compilerId&gt;
          &lt;source&gt;1.8&lt;/source&gt;
          &lt;target&gt;1.8&lt;/target&gt;
        &lt;/configuration&gt;
        &lt;dependencies&gt;
          &lt;dependency&gt;
            &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;
            &lt;artifactId&gt;groovy-eclipse-compiler&lt;/artifactId&gt;
            &lt;version&gt;2.9.2-01&lt;/version&gt;
          &lt;/dependency&gt;
          &lt;dependency&gt;
            &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;
            &lt;artifactId&gt;groovy-eclipse-batch&lt;/artifactId&gt;
            &lt;version&gt;2.4.3-01&lt;/version&gt;
          &lt;/dependency&gt;
        &lt;/dependencies&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
&lt;/project&gt;
  • Java version - 1.8.0_231
  • Maven - 3.6.2
  • OS - Mac 10.15.6
  • groovy-eclipse-compiler - 2.9.2-01
  • groovy-eclipse-batch - 2.4.3-01

答案1

得分: 1

你引用的 "SharedResourceHelper.getFileResource(EasyMock.anyString(), EasyMock.anyObject())" 的确是不明确的。如果在 "EasyMock.anyObject()" 之前添加一个类型转换,就可以消除歧义。而且 EasyMock 可能还提供了一个 "any" 方法,你可以传入一个类型。

groovy-eclipse-compiler 是基于 ecj(eclipse 编译器用于 Java)而不是 javac,因此它们之间肯定会有差异。也有可能 ecj 对于这种特定情况有不同的默认错误/警告级别。如果你认为这应该是一个错误,你可以在 bugs.eclipse.org 上报告一个 JDT bug。

英文:

You reference "SharedResourceHelper.getFileResource(EasyMock.anyString(), EasyMock.anyObject())" is indeed ambiguous. If you add a typecast before "EasyMock.anyObject()" you could disambiguate. And EasyMock probably provides an "any" method that you can pass a type into as well.

groovy-eclipse-compiler is based upon ecj (eclipse compiler for java) and not javac, so there are bound to be differences. It may also be that ecj has a different default error/warning level for this particular case. If you feel this should be an error, you can file a JDT bug at bugs.eclipse.org.

答案2

得分: 0

eric-milles提供了一些进一步探索的方向。他的意见可以在https://github.com/groovy/groovy-eclipse/issues/1157找到。

根据他的评论,我们探索了https://github.com/groovy/groovy-eclipse/blob/master/extras/groovy-eclipse-batch-builder/build.properties的历史,发现编译问题发生在2.4.12-01(编译正常)和2.4.12-02(编译中断,如预期)之间,这是2.9.2版本的一部分。

这个变化发生在2017年8月10日(13c1c2a#diff-c8c111c3afb6080ae6b32148caaf6a0a),评论中提到"移除codehaus引用"。jdt.patch.target是针对e44(Luna)的。对于这两个文件都是相同的。

我花了一些时间探索https://github.com/eclipse/eclipse.jdt.core,试图弄清楚编译器行为可能如何改变,但没有太多收获。尽管我不太确定,但我觉得groovy-eclipse-batch(在2.4.12-01和2.4.12-02之间的变化)可能是这个问题的原因。

在投入了这么多时间之后,我觉得进一步调试以找出根本原因已经没有必要,因为这个问题已经在下一个版本(2.4.12-02及以后)中得到了解决。

英文:

eric-milles gave some direction to further explore this. His input is available at https://github.com/groovy/groovy-eclipse/issues/1157.

Based on his comment, we explored the history of https://github.com/groovy/groovy-eclipse/blob/master/extras/groovy-eclipse-batch-builder/build.properties and found that the compilation issue was between 2.4.12-01 (compilation works) and 2.4.12-02 (compilation breaks- as expected), which was part of release 2.9.2.

The change happened on Aug 10, 2017 (13c1c2a#diff-c8c111c3afb6080ae6b32148caaf6a0a), with comment as "Remove codehaus references". The jdt.patch.target was targeted for e44 which is Luna. This was same for both the files.

I invested some time in exploring https://github.com/eclipse/eclipse.jdt.core, to figure out how compiler behaviour could have altered, but could not get much. Though I am not very sure, but I feel that change in groovy-eclipse-batch (between 2.4.12-01 and 2.4.12-02) might be the cause of this.

Having invested this much time, I feel that it is not worth to further debug on this to figure out the root cause as the issue is already fixed in next version(s) [2.4.12-02 and beyond].

huangapple
  • 本文由 发表于 2020年9月11日 19:23:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/63846102.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定