java - 使用 Maven 的 Oracle JDBC 项目 : runs fine in IDE but ClassNotFoundException in command-line

标签 java oracle maven intellij-idea ojdbc

我目前有一个类项目,其中包括使用 JavaFX 和 Oracle JDBC 制作 Java 软件。为了使该项目能够在学校的计算机上运行,​​我们被要求使用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 文件,所以我真的不知道还能做什么。

我使用以下几行使我的程序连接到数据库:

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

问题是:这在 IntelliJ 中工作得很好,我可以向数据库发出请求并获取数据等。 但是,当我尝试使用命令行界面命令运行项目时:

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 is 在类路径中,所以我真的无法理解为什么同一个程序可以在 IntelliJ 中运行,但不能在命令行界面中运行:我本以为 IDE 和 mvn jfx:ru​​n 都会运行相同的命令来启动程序。

感谢您花时间阅读这篇文章,我希望我已经说得足够清楚了,如果我错过了另一篇可以解决我的问题的文章,请随时告诉我。

最佳答案

Oracle JDBC 驱动程序现在位于 Maven 中央存储库上。

对于 Java8/Oracle 12,您应该使用:

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1</version>
</dependency>

关于java - 使用 Maven 的 Oracle JDBC 项目 : runs fine in IDE but ClassNotFoundException in command-line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61369674/

相关文章:

python - Maven有一个pip安装插件吗?

java - 订阅主题突然抛出 "java.io.IOException: InternalServerError"

java - ClassNotFoundException Spring + JSF 尝试实现 Spring Security 登录时出现错误

java - 在 Java 中解析绑定(bind) 9.x 区域文件的库?

sql - 是否可以使用 SQL 更新 CLOB 内的数据?

oracle - 如何以普通用户身份在 Oracle 中运行 dbms_crypto 函数?

sql - 如何改进时间线 SQL 查询

java - launch4j maven 插件 - 配置 .exe 以需要管理员角色

java - Keycloak 自定义用户存储不显示属性

java - 为什么 Maven 找不到这个 jar