繁体   English   中英

Jar:未找到类定义错误

[英]Jar : No Class Def Found Error

我正在尝试使用Ant Build构建一个项目,并且我引用了多个jar使其工作。 现在,当我将由Ant构建的罐子放在其他机器上并运行它时。 我收到错误消息说NoClassDefFoundError org/apache... Not found 无论如何,是否将所有引用的jar放在项目的类路径或清单文件中?
还是在项目中重新打包所有jar? 我知道有一种使用jarjar的方法,但是我不知道如何使用它。
请给我提出一些想法,我已经在这个小问题上困扰了很长时间了。

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

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

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

如果您需要一个jar文件,则可以执行以下操作。 假设您拥有的所有第3方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文件,其中包含来自所有第3方jar的所有类。 了解这将导致等效文件(例如MANIFEST.MF文件)在多个jar中存在并且仅存在最后一个时被覆盖。

有了这个新的全库jar之后,就可以将您的应用程序类和该全库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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM