Запуск OptaPlanner по пути модуля - PullRequest
3 голосов
/ 12 марта 2019

Я бы хотел, чтобы мой проект OptaPlanner выполнялся по пути модуля.

Я создал пример репозитория ( mwkroening / optaplanner-modulepath-example ) на основе демонстрации балансировки облака в документах.

Пример проекта хорошо работает на classpath, но есть проблема, которую я не могу обойти, пытаясь заставить его работать по пути к модулю. Вы можете видеть прогресс в PR # 1 .

Не удается загрузить ScoreDrl, указанный в solverConfig.xml , за исключением следующего:

Exception in thread "main" java.lang.IllegalArgumentException: The scoreDrl (io/github/mwkroening/optaplannermodulepathexample/cloudBalancingScoreRules.drl) does not exist as a classpath resource in the classLoader (jdk.internal.loader.ClassLoaders$AppClassLoader@7c16905e).
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:519)
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:351)
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:255)
    at org.optaplanner.core@7.18.0.Final/org.optaplanner.core.impl.solver.AbstractSolverFactory.buildSolver(AbstractSolverFactory.java:61)
    at io.github.mwkroening.optaplannermodulepathexample/io.github.mwkroening.optaplannermodulepathexample.App.main(App.java:14)

Я уже получал подобное исключение при вызове SolverFactory.createFromXmlResource . Вместо этого я решил обойти эту проблему:

SolverFactory.createFromXmlInputStream(
  App.class.getResourceAsStream("cloudBalancingSolverConfig.xml"));

Я посмотрел на PLANNER-883 и psiroky / optaplanner-cloudbalancing-jdk9 , но я думаю, что в этом случае использовался ресурс classpath, а не один на пути к модулю.

Как я мог решить эту проблему? Возможно, мне следует открыть вопрос, а не публиковать его здесь, верно?

1 Ответ

1 голос
/ 13 марта 2019

Существует перегруженный метод каждого SolverFactory.createFrom*(...), который принимает загрузчик классов: SolverFactory.createFrom*(..., classloader). Этот загрузчик классов используется не только для загрузки ресурсов XML, но и для ресурса DRL.

Так что попробуйте:

SolverFactory.createFromXmlResource("/.../cloudBalancingSolverConfig.xml",
    App.class.getClassLoader())

Я еще не проверял это сам, но если это сработает, я бы хотел, чтобы это добавилось к разделу "головоломки" в руководстве (PR welcome:).

...