Oracle JDB C проект с Maven: отлично работает в IDE, но ClassNotFoundException в командной строке - PullRequest
2 голосов
/ 22 апреля 2020

В настоящее время у меня есть проект класса, который состоит в создании программного обеспечения на Java с использованием JavaFX и Oracle JDB C. Чтобы запустить проект на компьютерах школы, нас просят сделать это с использованием Java 1.8 и ojdbc6.jar.

Я использую Maven для этого проекта, и обычно мне просто нужно установить ojdbc6 локально, но мне нужно, чтобы он работал на компьютере учителя, у которого есть файл jar в /opt/oracle/ojdbc6.jar. Таким образом, я добавил копию этого ojdbc6.jar в каталог своего проекта и импортировал зависимость в pom.xml следующим образом:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.1.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/ojdbc6.jar</systemPath>
</dependency>

Таким образом, учитель сможет скомпилировать проект потому что все, что ему нужно, уже есть.

Из других постов я понял, что это не очень хорошее решение, но так как учитель не установит файл jar локально, я не знаю, что еще нужно do.

Я использую следующие строки для подключения моей программы к базе данных:

try {
    Class.forName("oracle.jdbc.OracleDriver");
    connection = DriverManager.getConnection(url, user, passwd);
}
catch /* etc */

Проблема в том, что это прекрасно работает внутри IntelliJ, я могу делать запросы к базе данных и получить данные и др. c. Однако, когда я пытаюсь запустить проект, используя команду интерфейса командной строки:

mvn clean compile jfx:run

Он работает нормально, пока я не выполню действие, использующее базу данных, и не получу следующее исключение:

java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at fr.ensimag.equipe3.model.DAO.ConnectionDB.connect(ConnectionDB.java:34)
        at fr.ensimag.equipe3.model.DAO.ConnectionDB.<init>(ConnectionDB.java:29)
        at fr.ensimag.equipe3.model.DAO.ConnectionDB.<clinit>(ConnectionDB.java:12)
        at fr.ensimag.equipe3.model.DAO.UserDAO.get(UserDAO.java:32)
        at fr.ensimag.equipe3.controller.LoginController.connexion(LoginController.java:28)
        at fr.ensimag.equipe3.controller.LoginController.onEnter(LoginController.java:49)
        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:498)
        at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
        at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
        at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
        at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Node.fireEvent(Node.java:8411)
        at com.sun.javafx.scene.control.behavior.TextFieldBehavior.fire(TextFieldBehavior.java:179)
        at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:178)
        at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:218)
        at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(TextInputControlBehavior.java:127)
        at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$74(BehaviorBase
.java:135)
        at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Scene$KeyHandler.process(Scene.java:3964)
        at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3910)
        at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040)
        at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2501)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:217)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:149)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$352(GlassViewEventHandler.java:248)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:247)
        at com.sun.glass.ui.View.handleKeyEvent(View.java:546)
        at com.sun.glass.ui.View.notifyKey(View.java:966)
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
        at java.lang.Thread.run(Thread.java:748)

Похоже, Java не может найти мой ojdbc6.jar файл ... Я попытался отобразить путь к классу, используемый Maven, используя:

mvn dependency:build-classpath

, и получается ojdbc6.jar - это в пути к классам, поэтому я действительно не могу понять, почему одна и та же программа работает в IntelliJ, но не в интерфейсе командной строки: я бы подумал, что и в среде IDE, и в mvn jfx:run будут выполняться одни и те же команды для того, чтобы запустить программу.

Спасибо за ваше время, если вы прочитали этот пост, я надеюсь, что я достаточно ясен и не стесняюсь сказать мне, если я пропустил другой пост, который решит мою проблему.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Правильный GAV для 12.1.0.1 приведен ниже. Обратитесь к blog для получения более подробной информации о версиях и доступных файлах.

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.1</version>
</dependency>
1 голос
/ 22 апреля 2020

Oracle JDB C драйверы теперь находятся в центральном репозитории Maven.

Для Java8 / Oracle 12 вы должны использовать:

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1</version>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...