我有一个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中引用jar(derby.jar
等)?
答案 0 :(得分:34)
您需要一个自定义类加载器,请查看One Jar。
One-JAR允许您将Java应用程序及其依赖项Jars打包到一个可执行的Jar文件中。
它有一个蚂蚁任务,可以简化它的构建。
参考(来自background)
大多数开发人员合理地假设将依赖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文件的目录中时,此方法才有效。
答案 1 :(得分:20)
你做不到。来自official tutorial:
通过在清单中使用Class-Path标头,您可以避免使用 在调用Java运行你的时指定一个long -classpath标志 应用
注意:Class-Path标头指向上的类或JAR文件 本地网络,而不是JAR文件中的JAR文件或可访问的类 通过互联网协议。在JAR中的JAR文件中加载类 将文件放入类路径中,必须编写自定义代码来加载它们 类。例如,如果MyJar.jar包含另一个名为的JAR文件 MyUtils.jar,你不能在MyJar.jar中使用Class-Path头 显示将MyUtils.jar中的类加载到类路径中。
答案 2 :(得分:10)
在Eclipse中,您可以选择导出可执行jar。 您可以选择将所有与项目相关的jar打包到生成的jar中,这样eclipse就会添加自定义类加载器,它将在新jar中引用您的集成jar。
答案 3 :(得分:6)
类加载器的默认实现无法从jar-in-a-jar加载:为了做到这一点,整个'sub-jar'必须加载到内存中,这会破坏随机访问的好处。 jar格式(引用待定 - 一旦我找到支持此文档的文档,我将进行编辑。)
我建议使用JarSplice之类的程序将您的所有内容捆绑到一个干净的可执行jar中。
修改:无法找到源参考,但这是Sun网站上未解析的RFE,描述了这个确切的“问题”:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386
此外,您可以通过将库jar文件放在\lib
目录的classes
子目录中,然后从命令行运行来“测试”您的程序是否正常工作。换句话说,使用以下目录结构:
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
答案 4 :(得分:2)
将jar文件添加到库(如果使用netbeans)并修改清单文件classpath
,如下所示:
Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar
存在类似的答案here
答案 5 :(得分:1)
如果您不想创建自定义类加载器。您可以读取jar文件流。并将其传输到File对象。然后,您可以获取文件的网址。将其发送到URLClassLoader,您可以根据需要加载jar文件。 样本:
<div class="row">
<!-- Left col -->
<div class="col-md-4">
<div class="box box-primary" >
<div class="box-header with-border">
<h3 class="box-title">Visitor In Visitor Out</h3>
</div>
<div class="box-body">
<div class="chart">
<div id="chart_div" style="border: 1px solid #ccc"></div>
</div>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
<!-- Middle col -->
<div class="col-md-4">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">Visitor Duration</h3>
</div>
<div class="box-body">
<div class="chart">
<div id="chart_div2" style="border: 1px solid #ccc"></div>
</div>
</div>
<!-- /.box-body -->
</div>
</div>
<!-- Right col -->
<div class="col-md-4">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">Visitor Reports</h3>
</div>
<div class="box-body">
<div class="chart">
<div id="chart_div3" style="border: 1px solid #ccc"></div>
</div>
</div>
<!-- /.box-body -->
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-4">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">Visiting Hours</h3>
</div>
<div class="boxy">
<div id="chart_div4"></div>
</div>
</div>
</div>
</div>
答案 6 :(得分:-1)
在eclipse中,右键单击项目,选择RunAs - &gt;运行配置并保存运行配置,这将在您下次导出为Runnable JAR
时使用