2017-09-05 4 views
0

내 프로젝트에서 jpl 라이브러리를 사용하는 데 문제가 있습니다.jpl 라이브러리가 java maven 프로젝트와 함께 작동하지 않습니다.

이상한 점은이 솔루션 JPL/SWI Prolog configuration failure을 수행하면 일반 Java 응용 프로그램이었던 이전 프로젝트에서 jpl 라이브러리로 잘 작동한다는 것입니다. 해결책은 Java로 라이브러리를 말하기 위해 환경 변수를 구성해야한다고 언급했습니다.

한편 새 프로젝트는 maven 프로젝트입니다. 먼저 Maven의 의존성을 아래에 포함시켰다.

<dependency> 
     <groupId>jpl</groupId> 
     <artifactId>jpl</artifactId> 
     <version>7.4.0</version> 
     <type>jar</type> 
    </dependency> 

하지만 아래의 예외를지고 있다고는 :

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: org.jpl7.fli.Prolog.current_query()Lorg/jpl7/fli/qid_t; at org.jpl7.fli.Prolog.current_query(Native Method) at org.jpl7.Query.close(Query.java:540) at org.jpl7.Util.textToTerm(Util.java:130) at org.jpl7.Query.(Query.java:185) at com.michalistourism.core.PrologHandler.RunGorgias(PrologHandler.java:47) at com.persistence.TourismSession.RunPrologFile(TourismSession.java:281) at com.michalistourism.tourismassistant.ChatBoxPanel.btnDoNowActionPerformed(ChatBoxPanel.java:109) at com.michalistourism.tourismassistant.ChatBoxPanel.access$100(ChatBoxPanel.java:22) at com.michalistourism.tourismassistant.ChatBoxPanel$2.actionPerformed(ChatBoxPanel.java:74) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6533) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6298) at java.awt.Container.processEvent(Container.java:2236) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2294) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) at java.awt.Container.dispatchEventImpl(Container.java:2280) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

이 위의 예외가 발생 내 코드의 조각이다.

public PrologReaderCollection RunGorgias(List<Context> contexts) { 

    JPL.init(); 

    String filename = prologFilePath; 

    filename = filename.replace('\\', '/'); 
    String t1 = "consult('" + filename + "')"; 
    PrologReaderCollection output = new PrologReaderCollection(); 
    Integer count =1; 

    for(Context cont : contexts) { 
     Query q1 = new Query(t1); 
     //Query q1 = new Query("consult",new Term[] {new Atom(t1)}); 
     if (q1.hasNext()) { 
      String Request = "prove([" + cont.getName().toLowerCase() + "(" + cont.getParameters() + ")],Expl)."; 
      q1 = new Query(Request); 
      while (q1.hasNext()) { 
        Map<String, Term> map = q1.nextSolution(); 
        String expl = map.get("Expl").toString(); 
        PrologReader pr = new PrologReader("Solution " + count + " for " + cont.getName().toLowerCase() + ":\n" + expl + "\n\n",cont.getSet(),cont.getName().toLowerCase()); 
        output.add(pr); 
        count += 1; 

        if(count > 3) { 
         break; 
        } 
      } 
     } 
     count = 1; 
    } 

    return output; 
} 

그럼 내가 jar 파일이 내부에 lib 폴더를 프로젝트 내 이전 자바 프로젝트에 사용했다고하는 JPL 항아리를 가리키는 받는다는 실행 종속을 추가했습니다.

<dependency> 
     <groupId>jpl</groupId> 
     <artifactId>jpl</artifactId> 
     <version>7.4.0</version> 
     <scope>system</scope> 
     <systemPath>${basedir}/lib/jpl.jar</systemPath> 
    </dependency> 

project's file structure

이 경우 새로운 예외가 하나 아래입니다 : 내가 할 수있는 일이

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/jpl7/JPL at com.michalistourism.core.PrologHandler.RunGorgias(PrologHandler.java:37) at com.persistence.TourismSession.RunPrologFile(TourismSession.java:281) at com.michalistourism.tourismassistant.ChatBoxPanel.btnDoNowActionPerformed(ChatBoxPanel.java:109) at com.michalistourism.tourismassistant.ChatBoxPanel.access$100(ChatBoxPanel.java:22) at com.michalistourism.tourismassistant.ChatBoxPanel$2.actionPerformed(ChatBoxPanel.java:74) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6533) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6298) at java.awt.Container.processEvent(Container.java:2236) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2294) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) at java.awt.Container.dispatchEventImpl(Container.java:2280) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) Caused by: java.lang.ClassNotFoundException: org.jpl7.JPL at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 41 more

있습니까?

답변

0

필자는 maven을 7.4.0이 아닌 7.0.1 버전의 jpl로 참조하여 문제를 해결할 수있었습니다. 분명히 나는 ​​라이브러리의 이전 버전이 필요했다.

<dependency> 
    <groupId>jpl</groupId> 
    <artifactId>jpl</artifactId> 
    <version>7.0.1</version> 
</dependency>