我正在使用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;
}
答案 0 :(得分:0)
在切换回1.16.2之后,我遇到了同样的问题,似乎有效。