【问题标题】:Jar : No Class Def Found Error罐子:没有找到类定义错误
【发布时间】:2013-04-17 12:50:24
【问题描述】:

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

【问题讨论】:

  • 你是如何运行它的?
  • 也许这会有所帮助:stackoverflow.com/questions/1821803/…
  • 目标机器上是否有外部 jars(包含 org/apache 等的)?类路径或 java.ext.dirs 是否设置为指向目标机器上的外部 jar?
  • “请提出一些想法” 正确拼写单词是一个想法 - 这个词是“请”。
  • 我创建了一个名为 lib 的文件夹,并在其中添加了所有引用的 jar。

标签: java ant jar noclassdeffounderror


【解决方案1】:

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

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

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

如果您想要一个 jar 文件,您可以执行以下操作。假设您拥有的所有 3rd 方 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 方的所有类罐子。请理解,如果等效文件(如 MANIFEST.MF 文件)存在于多个 jar 中并且仅存在最后一个,则会导致它们被覆盖。

一旦你有了这个新的 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 文件和您的类中的所有类/属性文件/资源​​。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多