groovy eclipse编译器编译,但javac编译失败

groovy eclipse编译器编译,但javac编译失败,java,groovy,javac,groovy-eclipse,Java,Groovy,Javac,Groovy Eclipse,我的项目使用groovy eclipse编译器成功构建,但没有groovy eclipse编译器(仅使用javac)就失败了。生成失败,并显示以下错误消息(在模拟调用时在测试类中报告) 为了调试这个问题,我创建了一个包含最少文件的项目(如下所示)。虽然在这个项目中我们也有groovy源代码,但我并没有将它们包含在这里以保持代码的最小化。 代码也被推送到git上,可以在 我的怀疑:报告的问题看起来是合法的,我觉得groovy eclipse编译器也必须失败,但似乎错误被忽略了。我试图理解是什么让g

我的项目使用groovy eclipse编译器成功构建,但没有groovy eclipse编译器(仅使用javac)就失败了。生成失败,并显示以下错误消息(在模拟调用时在测试类中报告)

为了调试这个问题,我创建了一个包含最少文件的项目(如下所示)。虽然在这个项目中我们也有groovy源代码,但我并没有将它们包含在这里以保持代码的最小化。 代码也被推送到git上,可以在

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

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

import java.util.Map;

public interface IStrategy {
    Map<String, Object> getEnvMap();
}
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;
    }
}
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


4.0.0
project.debug
项目
罐子
1.0-快照
org.powermock
powermock api easymock
2.0.7
测试
org.powermock
powermock-module-junit4
2.0.7
测试
org.apache.maven.plugins
maven编译器插件
3.3
groovy eclipse编译器
1.8
1.8
org.codehaus.groovy
groovy eclipse编译器
2.9.2-01
org.codehaus.groovy
groovy eclipse批处理
2.4.3-01
  • Java版本-1.8.0ç
  • Maven-3.6.2
  • 操作系统-Mac 10.15.6
  • groovy eclipse编译器-2.9.2-01
  • groovy eclipse批处理-2.4.3-01
您引用的“SharedResourceHelper.getFileResource(EasyMock.anyString(),EasyMock.anyObject())”确实不明确。如果在“EasyMock.anyObject()”之前添加类型转换,则可以消除歧义。EasyMock可能提供了一个“任意”方法,您也可以将类型传递到该方法中

groovy eclipse编译器基于ecj(eclipse编译器for java)而非javac,因此必然存在差异。对于这种特殊情况,ecj也可能有不同的默认错误/警告级别。如果您觉得这应该是一个错误,您可以在bugs.eclipse.org上提交一个JDT bug。

给出了进一步探索的方向。他的意见可在以下网址获得:

根据他的评论,我们研究了该版本的历史,发现该版本的编译问题介于2.4.12-01(编译工作)和2.4.12-02(编译中断-如预期)之间,这是2.9.2版的一部分

变更发生在2017年8月10日(13c1c2a#diff-C8C111C3AFB6080AE6B3248CAAF6A0A),注释为“删除代码库引用”。jdt.patch.target是针对e44的,e44是Luna。这两个文件都是相同的

我花了一些时间进行探索,想弄清楚编译器的行为是如何改变的,但没能得到多少。虽然我不是很确定,但我觉得groovy eclipse批处理中的更改(介于2.4.12-01和2.4.12-02之间)可能是造成这种情况的原因


投入了这么多时间,我觉得不值得对此进行进一步调试以找出根本原因,因为问题已在下一个版本[2.4.12-02及更高版本]中得到解决。

我要注意,如果您要将代码重构为更干净的代码(通过使
SharedResourceHelper
非静态并实现一个可以模拟的接口),这不是问题。此外,如果您已经在使用Groovy,我强烈建议您使用Spock编写测试。您正在使用非常旧的Groovy eclipse批处理和Groovy eclipse编译器版本。最新版本是否会产生您要查找的编译器错误?@emilles-感谢您的建议。我错过了检查不同版本的JAR的机会。当我们将groovy eclipse批处理jar升级到2.4.16-02时,我们得到了预期的错误。看来修复是在这个版本中完成的。我试图在上找到问题,但无法识别它。也许这是通过其他票证修复的。无论如何,我认为这是一个合理的发现。非常感谢。Cheers弥补了groovy eclipse p中的一个缺陷github项目
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"));
      
    }
}
<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>