【问题标题】:Java ignores classpathJava 忽略类路径
【发布时间】:2011-08-17 00:48:15
【问题描述】:

我正在编写一个使用 Oracle JDBC 驱动程序的 java 程序。我已经在我的类路径中设置了它。当我在我的 IDE 中运行程序(作为库添加为 jdbc)时,程序运行良好。当我尝试部署它时,它完全忽略了类路径中的列表并给了我一个 NoClassDefFoundError。

我想使用客户端的 JDBC 驱动程序(已安装),但不提供我自己的。我从 JDeveloper 打包程序,部署为 JAR 文件。

运行:java -jar test.jar

当我将库放在 %JAVA_HOME%/lib/ext 中时,它可以正常工作。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 你能告诉我们你是如何在命令行上运行文件的吗?
  • 您如何准确部署它?你如何包装它?你如何启动它?请注意,如果您使用-jar 开关,那么在命令行和环境变量中指定的任何类路径都将被忽略。 只有清单的Class-Path 属性是相关的。
  • 那么我如何设置 Class-Path 以便它在我的环境类路径中查找?或者我可以运行 java -jar 以外的 jar 吗?
  • 只需将您的 jar 与您的应用一起提供。这是完全有效的。
  • @Nishant 也许是这样,但是 java 有一个类路径,并且 oracle 的安装程序在每次安装时都提供一个工作 jdbc。我们倾向于使用类路径中已经安装的 jdbc。

标签: java oracle jdbc


【解决方案1】:

当您使用java -jar 运行时,类路径将被忽略。

您需要使用 Class-Path 清单属性。

来自http://download.oracle.com/javase/tutorial/deployment/jar/downman.html

您指定要包含在小程序或应用程序清单文件的 Class-Path 标头字段中的类。 Class-Path 标头采用以下形式:

Class-Path: jar1-name jar2-name directory-name/jar3-name

来自http://download.oracle.com/javase/1.4.2/docs/tooldocs/linux/java.html

-jar

...

使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。

【讨论】:

  • +1 这是一个方便的utility,可以原位查看 JAR 的清单。
  • 但是我想使用当前环境的类路径中的 jar,而不是将其包含在我的项目中。使用-jar函数时,根本就不能使用classpath中的jar吗?
  • 您始终可以使用自己的类路径创建自己的类加载器。见download.oracle.com/javase/6/docs/api/java/net/…
  • @Joachim Sauer:在我看来,如果你必须使用 URLClassLoader 手动加载它,这完全超出了拥有类路径的目的......然后你必须知道你的 jar 的位置想要包含,而不是 JVM 为您解决这个问题......并且 Class-Path 不会在它自己舒适的项目文件夹之外寻找;所以我必须向用户询问 JDBC 驱动程序的位置?问题是我们不知道用户拥有哪个版本的 Oracle 数据库。从类路径加载它给我们带来了用户获得兼容版本(通常与数据库一起提供)的优势。
  • @Ferdy:我现在不想讨论该设计决策的哲学含义。它就是这样,我们必须解决它。请注意,您的方法也有一个严重的缺点:您假设运行 Java 代码的机器安装了 Oracle 数据库(或至少安装了 JDBC 驱动程序)。这不一定是真的,为什么Java客户端不能连接到远程数据库?
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多