2

我在项目中使用 jpl 库时遇到问题。

奇怪的是,在一个旧项目上,这是一个普通的 Java 应用程序,通过遵循这个解决方案JPL/SWI Prolog configuration failure与 jpl 库一起工作得很好。解决方案提到我必须配置我的环境变量才能使库与 Java 对话。

另一方面,我的新项目是一个 Maven 项目。首先,我包含了 Maven 的以下依赖项。

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

但我得到了以下异常:

线程“AWT-EventQueue-0”中的异常 java.lang.UnsatisfiedLinkError: org.jpl7.fli.Prolog.current_query()Lorg/jpl7/fli/qid_t; 在 org.jpl7.fli.Prolog.current_query(Native Method) 在 org.jpl7.Query.close(Query.java:540) 在 org.jpl7.Util.textToTerm(Util.java:130) 在 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) 在 com.michalistourism.tourismassistant.ChatBoxPanel.access$100(ChatBoxPanel.java:22) 在 com.michalistourism.tourismassistant.ChatBoxPanel$2.actionPerformed(ChatBoxPanel.java:74) 在 javax.swing.AbstractButton。 fireActionPerformed(AbstractButton.java:

这是我的代码片段,其中引发了上述异常。

    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;
}

然后我尝试添加一个指向 jpl jar 的 maven 依赖项,我在以前的 Java 项目中使用过它,其中 jar 文件位于项目 lib 文件夹中。

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

项目的文件结构

在这种情况下,新的例外情况如下:

线程“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) 在 com.michalistourism.tourismassistant.ChatBoxPanel.btnDoNowActionPerformed(ChatBoxPanel.java:109) 在 com.michalistourism.tourismassistant.ChatBoxPanel.access$100(ChatBoxPanel.java:22) 在 com.michalistourism.tourismassistant.ChatBoxPanel$2.actionPerformed( ChatBoxPanel.java:74) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java :402) 在 javax.swing.DefaultButtonModel。setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6533) 在 javax.swing.JComponent.processMouseEvent (JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6298) 在 java.awt.Container.processEvent(Container.java:2236) 在 java.awt.Component.dispatchEventImpl(Component.java: 4889) 在 java.awt.Container.dispatchEventImpl(Container.java:2294) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 在 java. java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 在 java.awt.Container 的 awt.LightweightDispatcher.processMouseEvent(Container.java:4525)。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) 在 java.awt.EventQueue.access$500(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:709) 在 java.awt.EventQueue$3.run(EventQueue.java:703) ) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 在 java. java.awt.EventQueue$4.run(EventQueue.java:729) 在 java.security.AccessController 的 awt.EventQueue$4.run(EventQueue.java:731)。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) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java. awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 原因:java.lang.ClassNotFoundException: org.jpl7.JPL at java.net.URLClassLoader.findClass( URLClassLoader.java:381) 在 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 更多

有什么我可以做的吗?

4

1 回答 1

1

通过使用 maven 引用 jpl 的 7.0.1 版本而不是 7.4.0,我设法找到了解决我的问题的方法,并且它有效!显然我需要一个旧版本的库。

<dependency>
     <groupId>jpl</groupId>
     <artifactId>jpl</artifactId>
     <version>7.0.1</version>  
</dependency>
于 2017-09-09T13:14:20.600 回答