Я экспериментирую с Google Guice (3.0) и Google Reflections (0.9.6).
У меня есть следующие файлы:
Operation.java:
package com.company1.calculator;
public interface Operation {
public int apply(int a, int b);
}
Addition.java:
package com.company1.calculator;
public class Addition implements Operation {
@Override
public int apply(int a, int b) {
return a + b;
}
}
Другие различные классы "операций" распространяются по нескольким пакетам.
CalculatorModule.java:
package com.company1.calculator;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.MapBinder;
import org.reflections.Reflections;
public class CalculatorModule extends AbstractModule {
@Override
protected void configure() {
Reflections reflections = new Reflections("");
MapBinder<String, Operation> map = MapBinder.newMapBinder(binder(), String.class, Operation.class);
for (Class<? extends Operation> o : reflections.getSubTypesOf(Operation.class)) {
map.addBinding(o.getSimpleName()).to(o);
}
}
}
Calculator.java:
package com.company1.calculator;
import com.google.inject.Inject;
import java.util.Map;
public class Calculator {
private Map<String, Operation> operations;
@Inject
public Calculator(Map<String, Operation> operations) {
this.operations = operations;
}
public void printCalculations(int a, int b) {
System.out.println("Calculator: " + a + " " + b);
for (String s : operations.keySet()) {
System.out.print(s + ": ");
System.out.println(operations.get(s).apply(a, b));
}
}
}
И, наконец, App.java:
package com.company1.calculator;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class App {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new CalculatorModule());
Calculator c = injector.getInstance(Calculator.class);
c.printCalculations(3, 3);
}
}
После выполнения App.java внутри IntelliJ я получаю следующий вывод, как и ожидалось:
Калькулятор: 3 3
Модуль: 0
Деление: 1
Умножение: 9
Сложение: 6
Однако, когда я упаковываю это приложение как банку, я получаю только следующий вывод:
Калькулятор: 3 3
Почему это и как я могу это исправить?Самым близким, что я нашел, был Выпуск 48 , но там написано, что он исправлен по состоянию на май 2011 года. Конечно, сейчас это могло бы попасть в Maven ...