Играть!рамки [1.2.4] с слюнями на Heroku - PullRequest
4 голосов
/ 06 декабря 2011

Я попытался сделать простое веб-приложение, интегрированное с движком правил Drools, и развернул его на heroku. В действии контроллера я выполняю метод, который импортирует и анализирует файл DRL и возвращает результат. Я заметил странное поведение. Когда я запускаю приложение по команде play run Drools не хочет работать (я получаю некоторые ошибки импорта правил и исключение разбора знаний), но когда я запускаю свое приложение через Eclipse, все работает.

Я проверил, что именно выполняется этими различными способами:

Я пытался запустить play run с дополнительными аргументами Java, существующими в исполнении Eclipse, но я не нашел рабочей комбинации.

Есть идеи, какие аргументы добавить в команду play run, чтобы найти рабочее решение?

Заранее спасибо за любую помощь.

StackTrace:

java.lang.IllegalArgumentException:
    at drools.RuleEngine.readKnowledgeBase(RuleEngine.java:66)
    at drools.RuleEngine.run(RuleEngine.java:28)
    at controllers.Application.index(Application.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:546)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:500)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:159)
    at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:220)
    at play.Invoker$Invocation.run(Invoker.java:265)
    at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:200)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:165)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:679)

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Хорошо, я нашел решение для меня здесь: https://stackoverflow.com/a/7083303/894060 Я упаковал связанные с Drools классы и файл правил в один файл jar и поместил этот jar в один каталог, включенный в classpath - это решило проблему.

1 голос
/ 08 декабря 2011

Я не знаю, как сделать обходной путь / хак, чтобы он заработал.

Я сделал следующее, чтобы решить проблему. Я добавилСледующая строка в файл play \ framework \ pym \ play \ application.py в методе def getClasspath (self):

        classpath.append(os.path.normpath(os.path.join(os.path.join(self.path, 'tmp'),'classes')))

Выше просто добавляетклассы, которые находятся в каталоге play tmp> classes для classpath.

Все отлично работает.

Но я действительно не понимаю, как play может разрешить эти ссылки, где, как Droolsне в состоянии сделать это.

...