[英]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.