2014-07-22 3 views
0

optaplanner (6.0.1)를 사용하는 엔터프라이즈 애플리케이션 (Glassfish 4)을 만들고 있습니다. 솔버는 EJB 프로젝트 내에서 시작됩니다. 방금 찾은 XML 구성을로드 할 수 있지만 솔버를 빌드하는 drl을 찾지 못합니다.ejb 프로젝트에서 drl 리소스를 찾을 수 없습니다.

SolverFactory solverFactory = new XmlSolverFactory().configure(PropositionSB.class.getResourceAsStream("/resources/todoSolverConfig.xml")); 
Solver solver = solverFactory.buildSolver(); 

Caused by: java.lang.IllegalArgumentException: The scoreDrl (/resources/todoScoreRules.drl) does not exist as a classpath resource. 
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildKieBase(ScoreDirectorFactoryConfig.java:304) 
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:279) 
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:186) 
at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:174) 
at org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:145) 
at org.optaplanner.core.config.solver.XmlSolverFactory.buildSolver(XmlSolverFactory.java:101) 
at entityManagement.PropositionSB.solve(PropositionSB.java:110) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4695) 
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:630) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582) 
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582) 
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) 
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) 
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4667) 
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4655) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
... 53 more 

내가 비록 간단한 Java 응용 프로그램에서 작업 할 때이 같은 문제를 가지고 있겠지 발생합니다.

+0

귀하의 앱 서버는 무엇입니까? 글래스 피시? –

답변

0

은 앱 서버에서 다음을 시도해보십시오

// OptaPlanner 6.0 
URL r = SolverFactory.class.getResource("/resources/todoScoreRules.drl"); 
System.out.println("Resource found: " + (r == null)); 

// OptaPlanner 6.1+ 
URL r = SolverFactory.class.getClassLoader().getResource("resources/todoScoreRules.drl"); 
System.out.println("Resource found: " + (r == null)); 

그런 다음 자신의 getClass()SolverFactory.class를 교체하려고합니다.

또한 the docs added in this pull request이 관련되었을 수 있습니다.

+0

내 자신의 클래스를 사용할 때는 리소스를 찾을 수 있지만 SolverFactory에서는 리소스를 찾을 수 없습니다. SolverFactory.class.getResource (""); 배포 된 응용 프로그램에서 jar에 대한 경로를 반환합니다. 프로젝트에서 직접 optaplanner 소스를 복사하여이 기능을 사용할 수있었습니다. – Bruno

+0

그럴 경우'SolverFactory.createFromXmlInputStream (r.getInputStream())'을 사용하는 것이 더 낫습니다 (OptaPlanner 6.1이 필요하고 6.1.0.CR2 또는 Final을 사용하며 며칠 후에 출시 될 예정입니다) –

관련 문제