2012-01-08 3 views
4

私はGoogle Guice(3.0)とGoogle Reflections(0.9.6)を試しています。jarファイル内の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); 
    } 
} 

予想通りのIntelliJの内部App.javaを実行した後、私は、次の出力を得る:

計算:3~3
率:0
を分割:1
乗算:9
追加:

:私は唯一の次の出力を得るjarファイルとしてアプリケーションをパッケージしかし6

電卓:3 3

なぜこれがあるとどのように私はそれを修正することができますか?私が見つけた最も近いものはIssue 48でしたが、それは2011年5月現在で修正されています。確かにこれでMavenになってしまったでしょう...

答えて

2

これは説明どおり正確に再現できました。この問題は、デフォルトのReflectionsコンストラクタが、指定された各パラメータが見つかるディスク上の場所を検索しようとしているように見えます。/tmp/so8780228.jarから実行すると、/ tmp /(ConfigurationBuilder.java:87のブレークポイント)が見つかります。

単純な回避策は、他に何かを与えることですこれは構成情報に有用な情報がなく、ちょうど1つの場所にある "com.company1"のようなものです。

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

この場合、ConfigurationBuilderはパス/tmp/so8780228.jarを正しく検索し、すべて正常に動作します。

また、ConfigurationBuilderでもっとやり取りし、クラスパス上のすべてのjarを検索するように指示することもできます(たとえば、System.getProperty(java.class.path)を反復して追加するなど)。