3

我一直在尝试运行一个 jar 文件——我们称之为 test.jar——它在 Unix 系统上使用 Sybase jconn3.jar。

我创建了一个包含以下内容的 MANIFEST.MF 文件:

Class-Path: $SYBASE/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar

这给出了 ClassNotFoundError。$SYBASE 是指向 /opt/sybase13 的系统变量;我还尝试了以下方法:

Class-Path: /opt/sybase13/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar

Class-Path: opt/sybase13/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar

但是,如果我将 jconn3.jar 文件从 $SYBASE/jConnect-6_0/classes 复制到与 test.jar 相同的目录,并将我的 MANIFEST.MF 更新为如下所示:

Class-Path: jconn3.jar commons-net-1.3.0.jar

应用程序按预期运行。

现在,我已经能够通过在本地复制 jconn3.jar 文件来验证它是否有效;我的 MANIFEST.MF 文件包含我的主类的路径,所以这里没有问题。

你认为可能是什么问题?我已经看这个东西太久了。谢谢!

4

2 回答 2

12

类路径中的条目要么是相对于嵌入它们的 JAR(你有工作)要么是 URL。为了使您的绝对路径起作用,您需要将它们转换为 URL,例如,

file:/opt/sybase13/...

没有使用变量的机制。

尽管 JAR 规范没有明确说明,但绝对file:方案 URL 确实在 class-path 属性中起作用。

于 2008-12-01T23:03:10.870 回答
0

类加载器 AFAIK 不读取环境变量。但是,您可以在配置脚本中添加 jar

根据规范,条目是相对于 jar 不是绝对的:

类路径:

此属性的值指定此应用程序或扩展所需的扩展或库的相对 URL。URL 由一个或多个空格分隔。应用程序或扩展类加载器使用此属性的值来构造其内部搜索路径。

http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html #Manifest 规范

于 2008-12-01T23:06:39.257 回答