jar子里的参考瓶子
我有一个内容如下所示的jar,
以下是我的清单文件
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时,它抛出了一个ClassNotFoundExcception
意思是它没有引用外部jar中的jar。
在Class-Path
属性中,如何在实际jar中引用jars( derby.jar
等)?
你将需要一个自定义的类加载器,看看一个jar子 。
One-JAR允许您将Java应用程序及其依赖项Jars打包到单个可执行Jar文件中。
它有一个ant的任务,可以简化它的build设。
参考 (从背景 )
大多数开发人员合理地认为,将一个依赖Jar文件放入他们自己的Jar文件中,并且将一个Class-Path属性添加到META-INF / MANIFEST中就可以做到这一点 :
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
Launcher$AppClassLoader
不知道如何使用这种Class-Path
从jar中的Jar中加载类。 试图使用jar:file:jarname.jar!/commons-logging.jar
也导致了一个死胡同。 只有将支持的Jar文件安装(即分散)到安装了jarname.jar文件的目录中时,这种方法才有效。
你不能。 从官方教程 :
通过使用清单中的Class-Path头,您可以避免在调用Java运行应用程序时指定long-classpath标志。
注:Class-Path头指向本地networking上的类或JAR文件,而不是JAR文件中的JAR文件或通过Internet协议访问的类。 要将JAR文件中的JAR文件中的类加载到类path中,必须编写自定义代码来加载这些类。 例如,如果MyJar.jar包含另一个名为MyUtils.jar的JAR文件,则不能在MyJar.jar的清单中使用Class-Path头来将MyUtils.jar中的类加载到类path中。
在Eclipse中,您可以select导出可执行的jar文件。 你可以select将所有项目相关的jar文件打包到生成的jar文件中,并以这种方式添加自定义的类加载器,它将引用你在新的jar文件中集成的jar文件。
类加载器的默认实现无法从jar中的jar加载:为了这样做,整个“sub-jar”将不得不加载到内存中,从而破坏了jar格式的随机访问优点参考挂起 – 我会做一个编辑,一旦我find支持这个文件)。
我build议使用诸如JarSplice之类的程序将所有内容捆绑到一个干净的可执行文件jar中。
编辑:找不到源引用,但这里有一个未解决的RFEclosures太阳网站描述这个确切的'问题': http : //bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386
另外,可以通过将库jar文件放在classes
目录的\lib
子目录中,然后从命令行运行来“testing”程序工作正常。 换句话说,用以下目录结构:
classes/org/sai/com/DerbyDemo.class classes/org/sai/com/OtherClassFiles.class classes/lib/derby.jar classes/lib/derbyclient.jar
从命令行导航到上面提到的“classes”目录,然后键入:
java -cp .:lib/* org.sai.com.DerbyDemo
将jar文件添加到您的库(如果使用netbeans)并修改清单的文件classpath
,如下所示:
Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar
这里也有类似的答案
在eclipse中,右键单击项目,selectRunAs – > Run Configuration并保存你的运行configuration,这将在你下一次导出为Runnable JAR时使用