Jar:没有Class Def Found错误

时间:2013-04-17 12:50:25

标签: java ant jar noclassdeffounderror

我正在尝试使用Ant Build构建一个项目,并且我引用了几个jar来使其工作。现在,当我将Ant构建的jar创建在其他机器上并运行它时。 我收到错误NoClassDefFoundError org/apache... Not found。 无论如何将所有引用的jar放在项目的类路径中或清单文件中? 或者无论如何重新包装项目中的所有jar? 我知道有一种方法使用 jarjar ,但我不知道如何使用它。
请告诉我一些想法,我长期坚持这个小问题。

1 个答案:

答案 0 :(得分:0)

使用ANT构建时,ANT工具会将您需要的外部jar添加到类路径中。查看构建脚本,您很可能在 javac 任务或定义类路径的安装任务中有一个条目。

构建代码后,您的jar文件中只包含您的类,默认情况下,第3方jar文件(如Apache)中的类不会添加到您的jar文件中。

您需要决定的是,您是否想要一个包含所有所需类的jar文件,或者您是否愿意部署多个jar文件?如果您愿意将应用程序作为多个jar文件提供,则需要提供批处理文件或shell脚本,以便为构建类路径的用户启动应用程序以包含已部署的jar文件。

如果您想要一个jar文件,可以执行以下操作。假设您拥有的所有第三方罐子都在ANT属性 lib.dir 标识的目录中:

<jar destfile='${build.dir}/lib-jars.jar'>
  <zipgroupfileset dir="${lib.dir}">
    <include name="**/*.jar" />
  </zipgroupfileset>
</jar>
<sleep seconds='1'/>  <!-- avoid timestamp warnings -->

这样做是在 build.dir 目录中创建一个名为 lib-jars.jar 的jar文件,其中包含来自所有第三方的所有类罐子。了解这将导致等效文件(如MANIFEST.MF文件)被覆盖,如果它们存在于多个罐子中,只有最后一个文件存在。

一旦你有了这个新的all-libs jar,你就可以将你的应用程序类和这个all-libs jar的内容装箱到一个jar中:

<jar destfile='${jar.file}' basedir='${classes.dir}'>
  <!-- using zipfileset we can filter on entries in the one file -->
  <zipfileset src='${build.dir}/lib-jars.jar'>
    <exclude name="META-INF/MANIFEST.MF"/>
  </zipfileset>
  <manifest>
    <attribute name="Built-By" value="${user.name}"/>
    <attribute name="Main-Class" value="${main.class}"/>
    <section name="common">
      <attribute name="Specification-Title" value="${project.title}"/>
      <attribute name="Specification-Version" value="${release.version}"/>
      <attribute name="Specification-Vendor" value="${vendor}"/>
      <attribute name="Implementation-Title" value="${project.title}"/>
      <attribute name="Implementation-Version" value="${release.version}"/> 
      <attribute name="Implementation-Vendor" value="${vendor}"/>
    </section>
  </manifest>      
</jar>

请注意我从all-libs jar中排除了MANIFEST.MF文件并创建了我自己的文件。然后,最终结果是一个jar文件,其中包含来自所有库jar文件和类的所有类/属性文件/资源​​。