Maven在编译期间找不到Lombok的ExtensionMethod

时间:2015-07-17 13:06:11

标签: maven lombok

我正在使用Eclipse,我有mulitmodule Maven项目,其中我使用Lombok(1.16.4)Java = jdk1.7.0_71。

在Eclipse中,所有代码都编译并且JUnit测试通过。但是在Maven(v.3.2.3和3.3.3)中,代码无法编译。

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] DetermineMarketDirection.java:[86,42] cannot find symbol
  symbol:   method sumValuesDouble(java.lang.String)
  location: variable listToWorkOn of type java.util.List<T>
[INFO] 1 error

sumValuesDouble是我在List<>中定义的类型module A的Lombok扩展方法。上述错误发生在module C,取决于module A

这是ExtensionList.java的一部分:

public static <T> Double sumValuesDouble(List<T> list, final String methodName) {
        return sumValuesOf(list, methodName, Double.class);
    }

    private static <T, N extends Number> N sumValuesOf(List<T> list, final String methodName, Class<N> type) {

        Function<T, N> transform = new Function<T, N>() {
            @SuppressWarnings("unchecked")
            @Override
            @SneakyThrows
            public N apply(T from) {
                Method method = from.getClass().getMethod(methodName);
                return (N) method.invoke(from);
            }
        };

        List<N> projectedList = Lists.transform(list, transform);
        return sumAll(projectedList);
    }

这很奇怪,因为我在Module A中为此扩展方法进行了测试,并且编译好并传递。

来自Module A的部分测试:

@ExtensionMethod({ ExtensionList.class })
public class ExtensionListSumAllTest {
    @Test
    public void testDouble() {
        List<ValueDouble> listDouble = new ArrayList<>();
        listDouble.add(new ValueDouble(1, 1d));
        listDouble.add(new ValueDouble(2, 2d));
        listDouble.add(new ValueDouble(3, 3d));
        Double actual = listDouble.sumValuesDouble("getValue");
        final Double expected = 6d;
        assertEquals(expected, actual);
    }

    @AllArgsConstructor
    @Getter
    public class ValueDouble {
        private final Integer id;
        private final Double value;
    }
}

如何让Maven“看到”这种方法?

BTW:我在module c中使用了很多扩展方法,Maven只有那个问题。同样在这个项目/日食中我使用龙目岛很长一段时间,之前我没有遇到过这样的问题。

更新:

我玩得多一点,我发现,当我在执行Extension方法之前添加'dummy'代码时,maven编译代码没有问题。

所以,这不会编译

@Slf4j
@ExtensionMethod({ ExtensionList.class })
public class SmaCalculator {
    static <C extends Candle> double calculateSMA(List<C> candles, int sma) {
        List<C> listToWorkOn = prepareListForSmaCalculation(candles, sma);

        Double sum = listToWorkOn.sumValuesOf("getClosePrice");

        Double smaValue = sum / sma;
        return smaValue;
    }
...other methods...
}

但是这会由Maven编译成功,而dupa对象甚至不会引用listToWorkOn对象:

static <C extends Candle> double calculateSMA(List<C> candles, int sma) {
    List<C> listToWorkOn = prepareListForSmaCalculation(candles, sma);

    List<C> dupa = new ArrayList<C>();
    dupa.add(listToWorkOn.first());
    dupa.sumValuesOf("getClosePrice");

    Double sum = listToWorkOn.sumValuesOf("getClosePrice");

    Double smaValue = sum / sma;
    return smaValue;
}

1 个答案:

答案 0 :(得分:0)

在切换回1.16.2之后,我遇到了同样的问题,似乎有效。