Библиотека jpl не будет работать с проектом Java Java

У меня проблема с использованием библиотеки jpl в моем проекте.

Странно то, что в старом проекте, который был обычным Java-приложением, он прекрасно работал с библиотекой jpl, следуя этому решению. Ошибка конфигурации JPL/SWI Prolog. В решении упоминалось, что мне пришлось настраивать свои переменные окружения, чтобы библиотека могла общаться с 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 (собственный метод) в org.jpl7.Query.close(Query.java:540) в org.jpl7.Util.textToTerm(Util.java:130) в org.jpl7.Query.(Query.java:185) в com.michalistourism.core.PrologHandler.RunGorgias(PrologHandler.java:47) в com.persistence.TourismSession.RunPrologFile(TourismSession.java:281) в com.michalistourism.tourismassistant.At (ChatBoxPanel.java:109) в com.michalistourism.tourismassistant.ChatBoxPanel.access$100(ChatBoxPanel.java:22) в com.michalistourism.tourismassistant.ChatBoxPanel$2.actionPerformed(ChatBoxPanel.java:74.Bav.fireActionPerformed(AbstractButton.java:2022) в javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) в javax.swing.DefaultButtonModel.fireActionPerformed(по умолчанию.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.java:4711) в java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) в java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) в java.awt.LightweightDispatcher.dispatchEvent(Container.java) в java.awt.Container.dispatchEventImpl(Container.java:2280) в java.awt.Window.dispatchEventImpl(Window.java:2746) в java.awt.Component.dispatchEvent(Component.java:4711) в 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. р un(EventQueue.java:703) в java.security.AccessController.doPrivileged(собственный метод) в java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) в java.security.PrictionDomain.Impse.java:90) в java.awt.EventQueue$4.run(EventQueue.java:731) в java.awt.EventQueue$4.run(EventQueue.java:729) в java.security.AccessController.doPrivileged(собственный метод) в java.security.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) в java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) в java.awt.EventDispatchThread.pumpEaws.jpg () DispatchThread.java:93) в 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;
}

Затем я попытался добавить зависимость maven, которая указывает на jpl jar, который я использовал в моем предыдущем проекте 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 в com.michalistourism.core.PrologHandler.RunGorgias(PrologHandler.java:37) в com.persistence.TourismSession.RavaPolog: 281) по адресу com.michalistourism.tourismassistant.ChatBoxPanel.btnDoNowActionPerformed(ChatBoxPanel.java:109) по адресу com.michalistourism.tourismassistant.ChatBoxPanel.access $ 100 (ChatBoxPanel.java:isticour.orourPortor.forma.bourfor.Berforfor.Berforfor.Berforfor.Berforfor.Berforfor.Berforfor.Berforfor.Berst. ChatBoxPanel.java:74) в javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) в javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) в javax.swing.Default.firetonButtonPuttonMuttonPutforM:402) в javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) в java.awt.ComponEvent:Mouseouse 6533) на javax.swing.JComponen t.processMouseEvent (JComponent.java:3324) в java.awt.Component.processEvent(Component.java:6298) в java.awt.Container.processEvent (Container.java:2236) в java.awt.Component.dispatchEventImpl (.java: 4889) в java.awt.Container.dispatchEventImpl(Container.java:2294) в java.awt.Component.dispatchEvent(Component.java:4711) в java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888). в java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) в java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) в java.awt.Container.dispatchEventImpl(Container.java:2280) в java.awt. Window.dispatchEventImpl (Window.java:2746) в java.awt.Component.dispatchEvent(Component.java:4711) в java.awt.EventQueue.dispatchEventImpl (EventQueue.java:758) в java.awt.EventQueueue EventQueue.java:97) в java.awt.EventQueue$3.run(EventQueue.java:709) в java.awt.EventQueue$3.run(EventQueue.java:703) в java.security.AccessController.doPrivileged(собственный метод) в java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) в java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) в java.awt.ueue в java.awt.EventQueue$4.run(EventQueue.java:729) в java.security.AccessController.doPrivileged(собственный метод) в java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:t.) EventQueue..java: 105) в java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) в java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) в java.awt.EventDispatchThreadjpatch (Event) 2) Вызывается: java.lang.ClassNotFoundException: org.jpl7.JPL на java.net.URLClassLoader.findClass(URLClassLoader.java:381) на java.lang.ClassLoader.loadClass(ClassLoader.java:424) на sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) в java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... еще 41

Есть ли что-то, что я могу сделать?

1 ответ

Решение

Мне удалось найти решение моей проблемы, сославшись на maven с версией 7.0.1 jpl, а не с 7.4.0, и это сработало! Видимо мне нужна была более старая версия библиотеки.

<dependency>
     <groupId>jpl</groupId>
     <artifactId>jpl</artifactId>
     <version>7.0.1</version>  
</dependency>
Другие вопросы по тегам