Java忽略了classpath。

13
我正在编写一个使用Oracle JDBC驱动程序的Java程序。我已经将其设置在我的classpath中。当我在IDE内运行程序(作为jdbc库添加)时,程序正常运行。但是当我尝试部署它时,它完全忽略了类路径中的列表,并给出了NoClassDefFoundError错误。
我想使用客户端的JDBC驱动程序(已安装的驱动程序)而不提供我的驱动程序。我从JDeveloper打包程序,部署为JAR文件。
运行方式:java -jar test.jar 当我将库放在%JAVA_HOME%/lib/ext中时,它可以正常工作。
有人知道如何解决这个问题吗?

你能展示一下如何在命令行上运行该文件吗? - Karthik Ramachandran
10
你是如何部署它的?你如何打包它?你如何启动它?请注意,如果你使用了"-jar"开关,那么在命令行和环境变量中指定的任何类路径都将被忽略。只有清单文件中的"Class-Path"属性才是相关的。 - Joachim Sauer
2
那么我如何设置Class-Path,以便它查找我的环境类路径?或者我可以运行一个除了java -jar之外的jar文件吗? - ferdyh
只需将您的应用程序与jar一起提供即可,这是完全有效的。 - Nishant
@Nishant 也许是这样,但是Java有一个类路径,Oracle的安装程序会为每个安装提供一个可用的JDBC。我们倾向于使用类路径中已经安装好的JDBC。 - ferdyh
正如其他人所指出的那样,请检查清单的Class-Path,由于您似乎想要使用来自Oracle的预部署JDBC jar,因此还要检查您的环境变量,因为如果您不使用清单,则正在使用它(因为您没有在命令行上提供任何值)。 Linux:echo $CLASSPATH Windows:echo %CLASSPATH%。 如果Oracle JAR不在您的清单或环境变量中,则您的JAR除了检查Java的标准位置(如您所指出的)之外,将不知道在哪里找到它,这是不好的做法。 - pickypg
1个回答

31

当你使用 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
这是一个方便的工具,可以在原地查看JAR清单。 - trashgod
1
然而,我想使用当前环境类路径中的一个jar文件,而不是将其包含在我的项目中。当使用“-jar”函数时,难道完全不能使用类路径中的jar文件吗? - ferdyh
@Ferdy:不,正如我在评论中所说的那样:如果你使用了-jar开关,就会检查你的.jar文件的Class-Path,否则就会使用命令行/环境变量的classpath。没有内置的方法同时使用两者。而且,拥有CLASSPATH变量的目的只是为了使Java的启动更容易。很快你会发现你需要一个构建系统来处理编译时的classpath,以及一个模块系统(甚至只是一个启动脚本)来处理运行时的classpath。 - Joachim Sauer
2
@Joachim Sauer:在我看来,如果你必须使用URLClassLoader手动加载类路径,那这完全打破了它的目的……然后你就必须知道想要包含的jar的位置,而不是让JVM为你解决这个问题……而Class-Path不能查找其自己舒适的项目文件夹之外的位置。那么我就必须询问用户JDBC驱动程序的位置吗?问题在于我们不知道用户使用的Oracle数据库版本。从类路径中加载这个可以让用户获得一个兼容的版本(通常随着数据库一起提供)。 - ferdyh
2
@Ferdy:我现在不想讨论那个设计决策的哲学意义。它就是这样,我们必须接受它。请注意,你的方法也有一个严重的缺点:你假设运行Java代码的机器已经安装了Oracle数据库(或至少安装了JDBC驱动程序)。这并不一定是真的,为什么Java客户端不能连接到远程数据库呢? - Joachim Sauer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接