1

我正在使用 wildfly-swarm 构建多个微服务。我有一个可以正常工作的微服务和一个在尝试启动 CDI 容器时失败的微服务,因为类 com.google.common.cache.Cache 不在 Classpath 中,而是从 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)。因此,我尝试以任何方式从功能区(来自 netflix-guava 模块)中排除番石榴依赖(通过直接排除主要功能区工件的番石榴依赖,并从主要功能区 aratifact 中排除 netflix-guava 依赖,然后自己添加对 netflix-guava 的依赖项并将其排除在外)。
通过在我的主类中手动排除 14.0.1 版的 guava 工件,我部分成功,但这会导致其他问题,我认为这不是一个可行的选择(因为这种行为可能导致我们不得不手动排除任何工件如果它导致问题,则附带一些依赖项。
所以我的问题是:有没有办法解决这种行为?或者我没有从 swarm 文档中获得的解决方案?我现在真的迷路了,任何帮助/想法都是非常感谢.以防万一这是构建我的部署的代码,因为我希望它工作(无需手动添加必要的工件以排除不需要的工件):

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);

}
4

0 回答 0