【问题标题】:Java Manifest.mf classpath issuesJava Manifest.mf 类路径问题
【发布时间】:2010-09-24 20:31:10
【问题描述】:

我一直在尝试运行一个 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 文件包含我的主类的路径,所以这里没有问题。

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

【问题讨论】:

  • 我假设这个 JAR 包含您的数据库驱动程序;应用程序创建自己的 java.net.URLClassLoader 来获取通过某些应用程序配置指定的类中的驱动程序类是很常见的。
  • 为什么不直接将 jar 附加到应用程序的启动脚本中。大多数应用服务器都有一个特殊的部分来放置这些额外的 jar。

标签: java variables system classpath manifest.mf


【解决方案1】:

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

file:/opt/sybase13/...

没有使用变量的机制。

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

【讨论】:

  • 这似乎暂时有效。我希望默认的 Manifest 文件有一个更灵活的解决方案(因为 Prod 服务器的该文件的路径与 Dev 服务器的路径不同),但它现在会启动并运行它。谢谢!
  • 尼克:如果可以,请尝试使用符号链接。不过,感谢埃里克森。工作正常,虽然我通常使用三个斜杠(文件:///opt/sybase),否则“主机”部分会丢失,一些工具需要它。
  • “让你的绝对路径工作”——这仍然适用于 Java 8 吗?无论有无“file://”前缀,我都无法获得工作的绝对路径。
  • @sillyfly 使用一到三个斜线。两个斜线无效。
  • 我试过file:///opt/.../opt/...,都没有成功。我的意思是 file:// 作为完整绝对路径的前缀,所以总共有 3 个斜杠。
【解决方案2】:

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

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

类路径:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2018-03-16
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    相关资源
    最近更新 更多