Wildfly-Swarm:类不在CDI wildfly-swarm微服务的Classpath中

时间:2016-06-03 11:32:56

标签: java cdi wildfly-10 wildfly-swarm

我正在使用wildfly-swarm构建多个微服务。我有一个正常工作的微服务和一个在尝试启动CDI-Container时失败的微服务,因为类路径中没有com.google.common.cache.Cache类,但是从ApplicationScoped Bean引用。这是我得到的堆栈跟踪:

WELD-001474: Class [...].core.framework.timeseries.cache.TimeseriesDataCache is on the classpath, but was ignored because a class it references was not found: com.google.common.cache.Cache from [Module \"deployment.43ef34ae-45a8-4468-aa7d-40d75c0f0a79.war:main\" from Service Module Loader].

奇怪的是,两个微服务都使用来自相同maven依赖的此类,但其他服务的工作方式与预期相同。主要区别在于,失败的微服务使用Ribbon(通过swarm-dependency),这带来了第二个Guava-Dependency(版本14.0.1)。因此,我试图以任何方式排除来自Ribbon(来自netflix-guava模块)的guava依赖(通过直接在主Ribbon工件上排除guava依赖关系并从主Ribbon Ribbon aratifact中排除netflix-guava依赖关系然后自己添加netflix-guava的依赖项并将其排除在那里。) 通过在我的主类中手动排除版本14.0.1的guava工件,我获得了部分成功,但这导致了其他问题,在我看来这不是一个可行的选择(因为这种行为可能导致我们不得不手动排除任何工件如果它导致问题,则附带一些依赖性 所以我的问题是:有没有办法解决这种行为?或者我从群组文档中得不到的解决方案?我现在真的迷失了,非常感谢任何帮助/想法。以防万一这是构建我的部署的代码,因为我希望它能够工作(无需手动添加必要的工件以排除不需要的工件):

public static void main(String[] args) throws Exception {
    Swarm container = new Swarm(args);
    final String offset = args.length > 0 ? args[0] : null;
    container = container.socketBindingGroup(new SocketBindingGroup("default-sockets","public","${jboss.socket.binding.port-offset:" +
            offset != null ? offset : "0" +
            "}"));
    container
            .fraction(new JAXRSFraction())
            .fraction(new CDIFraction())
            .fraction(new LoggingFraction());

    JAXRSArchive jaxrsArchive = ShrinkWrap.create(JAXRSArchive.class);
    jaxrsArchive.addAsResource(new ClassLoaderAsset("META-INF/beans.xml", FormulaDeployment.class.getClassLoader()), "classes/META-INF/beans.xml");
    jaxrsArchive.addAllDependencies();
    jaxrsArchive.addAsLibrary(container.createDefaultDeployment());
    jaxrsArchive.as(RibbonArchive.class).advertise();

    container.start().deploy(jaxrsArchive);

}

0 个答案:

没有答案