gpt4 book ai didi

java - Jar 文件中的 Guice 和 Reflections

转载 作者:搜寻专家 更新时间:2023-11-01 03:27:50 26 4
gpt4 key购买 nike

我正在试验 Google Guice (3.0) 和 Google Reflections (0.9.6)。

我有以下文件:

操作.java:

package com.company1.calculator;

public interface Operation {
public int apply(int a, int b);
}

加法.java:

package com.company1.calculator;

public class Addition implements Operation {
@Override
public int apply(int a, int b) {
return a + b;
}
}

其他各种“操作”类分布在多个包中。

计算器模块.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);
}
}
}

计算器.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 后,我得到了以下输出,正如预期的那样:

Calculator: 3 3
Modulus: 0
Division: 1
Multiplication: 9
Addition: 6

但是,当我将此应用程序打包为 jar 时,我只会得到以下输出:

Calculator: 3 3

为什么会这样,我该如何解决?我找到的最接近的是 Issue 48 ,但这表示截至 2011 年 5 月已修复。现在肯定已经将其纳入 Maven 中......

最佳答案

我能够完全按照描述重现这一点。问题似乎是默认的 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) 并添加每个),但性能会受到影响。

关于java - Jar 文件中的 Guice 和 Reflections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8780228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com