首页 > 解决方案 > Optaplanner:java.lang.NoSuchMethodError:com.google.common.collect.MapMaker.makeComputingMap

问题描述

@Test
    public void test_whenDroolsSolver(){
        SolverFactory<CourseSchedule> solverFactory =
                SolverFactory.createFromXmlResource("courseScheduleSolverConfigDrools.xml");
        Solver<CourseSchedule> solver = solverFactory.buildSolver();
        CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule);

        Assertions.assertNotNull(solvedCourseSchedule.getScore());
        Assertions.assertEquals(0, solvedCourseSchedule.getScore().getHardScore());
    }

我正在对上面的 Optaplanner 应用程序进行单元测试,但遇到以下错误:

java.lang.NoSuchMethodError: com.google.common.collect.MapMaker.makeComputingMap(Lcom/google/common/base/Function;)Ljava/util/concurrent/ConcurrentMap;

    at com.google.inject.internal.Annotations$AnnotationChecker.<init>(Annotations.java:104)
    at com.google.inject.internal.Annotations.<clinit>(Annotations.java:122)
    at com.google.inject.Key.ensureRetainedAtRuntime(Key.java:362)
    at com.google.inject.Key.strategyFor(Key.java:354)
    at com.google.inject.Key.get(Key.java:222)
    at org.eclipse.sisu.wire.ParameterKeys.<clinit>(ParameterKeys.java:28)
    at org.eclipse.sisu.wire.DependencyAnalyzer.<init>(DependencyAnalyzer.java:92)
    at org.eclipse.sisu.wire.ElementAnalyzer.<init>(ElementAnalyzer.java:87)
    at org.eclipse.sisu.wire.WireModule.configure(WireModule.java:74)
    at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:229)
    at com.google.inject.spi.Elements.getElements(Elements.java:103)
    at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:136)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:104)
    at com.google.inject.Guice.createInjector(Guice.java:94)
    at com.google.inject.Guice.createInjector(Guice.java:71)
    at com.google.inject.Guice.createInjector(Guice.java:61)
    at org.codehaus.plexus.DefaultPlexusContainer.addPlexusInjector(DefaultPlexusContainer.java:477)
    at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:203)
    at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:167)
    at org.kie.scanner.embedder.MavenEmbedderUtils.buildPlexusContainer(MavenEmbedderUtils.java:136)
    at org.kie.scanner.embedder.MavenEmbedderUtils.buildPlexusContainer(MavenEmbedderUtils.java:110)
    at org.kie.scanner.embedder.MavenEmbedder.<init>(MavenEmbedder.java:88)
    at org.kie.scanner.embedder.MavenEmbedder.<init>(MavenEmbedder.java:115)
    at org.kie.scanner.embedder.MavenProjectLoader.parseMavenPom(MavenProjectLoader.java:41)
    at org.kie.scanner.embedder.MavenProjectLoader.parseMavenPom(MavenProjectLoader.java:35)
    at org.kie.scanner.MavenPomModelGenerator.parse(MavenPomModelGenerator.java:19)
    at org.drools.compiler.kproject.xml.PomModel$Parser.parse(PomModel.java:64)
    at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildPomModel(KieBuilderImpl.java:422)
    at org.drools.compiler.kie.builder.impl.KieBuilderImpl.init(KieBuilderImpl.java:112)
    at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:154)
    at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:682)
    at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:463)
    at org.optaplanner.core.config.solver.SolverConfig.buildScoreDirectorFactory(SolverConfig.java:606)
    at org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:514)
    at org.optaplanner.core.impl.solver.DefaultSolverFactory.buildSolver(DefaultSolverFactory.java:49)
    at OptaPlannerUnitTest.test_whenDroolsSolver(OptaPlannerUnitTest.java:48)

我正在使用 makeComputingMap 方法不附带的 Maven guava 23.0 库。切换到较旧的 guava 13.0 可以解决此问题,但会出现另一种缺失的方法:

java.lang.NoSuchMethodError: com.google.common.collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;

buildSolver 类 org.optaplanner.core.impl.solver.DefaultSolverFactory.buildSolver 似乎在一些出现在旧版本和新版本上的 Guava 类上运行。有没有办法解决这个问题?

标签: droolsguavaoptaplanner

解决方案


将 OptaPlanner(也升级 Drools)升级到使用 guava 25.0 的最新版本。


推荐阅读