0

我的项目使用 groovy-eclipse-compiler 成功构建,但没有 groovy-eclipse-compiler(仅使用 javac)失败。构建失败并显示如下错误消息(在测试类中报告,同时模拟调用)

java: reference to getFileResource is ambiguous

为了调试问题,我创建了一个文件最少的项目(如下所示)。虽然在项目中我们也有 groovy 源代码,但我没有将它们包含在这里以保持代码最小化。该代码也被推送到 git,可在https://github.com/kaushalkumar/project-debug获得

我的疑问:报告的问题看起来是合法的,我觉得 groovy-eclipse-compiler 也必须失败,但似乎该错误被忽略了。我试图了解是什么让 groovy 编译器忽略它。这是 groovy 编译器中的问题吗?

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

import java.util.Map;

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

src/main/java/pkg1/SharedResourceHelper.java 包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 包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
4

2 回答 2

1

您引用“SharedResourceHelper.getFileResource(EasyMock.anyString(), EasyMock.anyObject())”确实是模棱两可的。如果您在“EasyMock.anyObject()”之前添加类型转换,您可以消除歧义。EasyMock 可能提供了一种“任何”方法,您也可以将类型传递给该方法。

groovy-eclipse-compiler 是基于 ecj(java 的 eclipse 编译器)而不是 javac,所以肯定会有差异。对于这种特殊情况,ecj 也可能具有不同的默认错误/警告级别。如果您觉得这应该是一个错误,您可以在 bugs.eclipse.org 提交 JDT 错误。

于 2020-09-11T17:07:22.420 回答
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 及更高版本] 中修复。

于 2020-09-14T08:20:43.520 回答