罐内的引用罐

2022-08-31 16:41:51

我有一个罐子,其内容如下所示,

enter image description here

以下是我的清单文件

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_06-b24 (Oracle Corporation)
Main-Class: org.sai.com.DerbyDemo
Class-Path: derby.jar derbyclient.jar derbynet.jar derbytools.jar

当我尝试运行jar时,它抛出了一个含义,它没有引用外部jar中的jar。ClassNotFoundExcception

在属性中,如何在实际 jar 中引用 jar(等)?Class-Pathderby.jar


答案 1

为此,您将需要一个自定义类装入器,请查看One Jar

One-JAR 允许您将 Java 应用程序及其依赖项 Jar 打包到单个可执行 Jar 文件中。

它有一个蚂蚁任务,也可以简化它的构建。

参考(来自背景))

大多数开发人员合理地假设,将依赖项 Jar 文件放入他们自己的 Jar 文件中,并向 META-INF/MANIFEST 添加 Class-Path 属性将起到作用


jarname.jar
| /META-INF
| |  MANIFEST.MF
| |    Main-Class: com.mydomain.mypackage.Main
| |    Class-Path: commons-logging.jar
| /com/mydomain/mypackage
| |  Main.class
| commons-logging.jar

不幸的是,这是行不通的。Java不知道如何从Jar中的Jar加载类,这种.试图使用也会导致死胡同。仅当您将支持 Jar 文件安装(即分散)到安装 jarname.jar 文件的目录中时,此方法才有效。Launcher$AppClassLoaderClass-Pathjar:file:jarname.jar!/commons-logging.jar


答案 2

你不能。来自官方教程

通过在清单中使用 Class-Path 标头,可以避免在调用 Java 来运行应用程序时必须指定长类路径标志。

注: 类路径标头指向本地网络上的类或 JAR 文件,而不是 JAR 文件中的 JAR 文件或可通过 Internet 协议访问的类。要将 JAR 文件中的 JAR 文件中的类装入到类路径中,必须编写自定义代码来装入这些类。例如,如果 MyJar.jar 包含另一个名为 MyUtils 的 JAR 文件.jar,则不能使用 MyJar.jar 清单中的类路径标头将 MyUtils 中的类加载.jar到类路径中。


推荐