罐子里面的参考罐子

时间:2012-09-10 18:05:16

标签: java jar manifest executable-jar

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

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时,它抛出了一个ClassNotFoundExcception,这意味着它没有引用外部jar中的jar。

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

7 个答案:

答案 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。 enter image description here 您可以选择将所有与项目相关的jar打包到生成的jar中,这样eclipse就会添加自定义类加载器,它将在新jar中引用您的集成jar。

enter image description here

答案 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

时使用