2012-01-08 35 views
4

我正在试用Google Guice(3.0)和Google Reflections(0.9.6)。Guice和罐子文件内的思考

我有以下文件:

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

这是为什么,我该如何解决?我发现的最接近的事情是Issue 48,但说固定为2011年5月的肯定,将我们已经进入Maven的现在......

回答

2

我能够描述准确地重现此。问题似乎是默认的Reflections构造函数试图找到磁盘上可以找到每个给定参数的位置。在IDE中通过“”时,它会找到/ bin目录,并从/tmp/so8780228.jar运行时,它会找到/ tmp /(断点位于ConfigurationBuilder.java:87)

简单的解决方法是给其他东西而不是“”,这使得配置不会构建有用的信息,而是给出诸如“com.company1”之类的东西,而这些东西恰好可以在一个位置找到。

Reflections reflections = new Reflections("com.company1"); 

在这种情况下,ConfigurationBuilder正确认定/tmp/so8780228.jar扫描,一切都会按预期的路径。或者,您可以与ConfigurationBuilder进行更多的交互,并告诉它搜索类路径中的每个jar(例如迭代System.getProperty(java.class.path)并添加每个jar),但是性能会受到影响。