5

我已经查看了许多有关此错误的现有线程,但仍然没有运气。我什至没有尝试打包 jar 或使用任何第三方打包工具。我只是从 Eclipse 中运行(效果很好),然后尝试从命令行运行完全相同的应用程序,在它构建到的相同位置(得到这个错误)。我的目标是能够压缩 bin 文件夹并将其发送给其他人通过命令行脚本运行。一些细节:

  • 它是一个命令行应用程序,我正在使用 commons-lang-2.4.jar 作为字符串实用程序。那是找不到的文件(特别是“java.lang.NoClassDefFoundError: org/apache/commons/lang/StringEscapeUtils”)
  • 我的lib文件夹中有那个jar,并通过右键单击“构建路径->添加到构建路径”将其添加到Eclipse中的构建路径中
  • .classpath 文件看起来正确并包含对 jar 的引用,但我假设该文件仅由 Eclipse 使用(包含这一行<classpathentry kind="lib" path="lib/commons-lang-2.4.jar"/>:)
  • 这可能与 Eclipse 工作目录设置有关吗?我在 src/templates 下创建了一些内部模板文件,我似乎可以看到这些文件的唯一方法是将项目工作目录设置为 AppName/src。也许我应该把它们放在别的地方?

让我知道是否有任何其他信息会有所帮助。当然,这很简单,但我在这一点上浪费了太多时间。这提醒了我为什么我最初在 05 年左右离开 Java ......

4

7 回答 7

13

ANoClassDefFoundError基本上意味着该类在编译时存在于类路径中,但在运行时它在类路径中缺失。

在您的情况下,从命令行执行使用时java.exe,您需要在-cpor-classpath参数中指定类路径。或者如果它是一个 JAR 文件,那么您需要在其文件的class-path条目中指定它。MANIFEST.MF

参数/条目的值可以是包含所有.class文件的文件夹或单个.jar文件的绝对或相对文件系统路径。您可以使用分号分隔路径;。当路径包含空格时,您需要用双引号包裹特定路径"。例子:

java -cp .;c:/path/to/file.jar;"c:/spacy path/to/classes" mypackage.MyClass

为了节省每次在命令行中键入和编辑参数的工作,请使用.bat文件。

编辑:我应该意识到您使用的是基于 Unix 的操作系统。上面的示例是针对 Windows 的。在类 Unix 平台的情况下,您可以遵循相同的规则,但您需要使用冒号分隔路径:,而不是最终的批处理文件,而是使用.sh文件。

java -cp .:/path/to/file.jar:"/spacy path/to/classes" mypackage.MyClass
于 2009-11-09T18:37:21.003 回答
6

您是否在命令行上指定 java 的类路径?

$ java -cp lib/commons-lang-2.4.jar your.main.Class
于 2009-11-09T18:34:50.463 回答
2

您在 Eclispe 中设置的类路径设置仅适用于 IDE,不会影响您的应用程序在 IDE 之外的运行方式。即使您使用 Eclipse 功能将您的应用程序导出为可执行 jar 文件,也没有现成的方式来打包您的应用程序所依赖的所有 jar。

如果您已将应用程序打包到一个名为的 jar 文件中,myapp.jar则运行如下命令将使用您所依赖的 jar 运行应用程序,如果您有多个 jar,则只需;在 Windows 或:Unix 上添加它们:

java -jar myapp.jar -cp .;c:/pathtolibs/commons-lang-2.4.jar

如果您只是直接运行类,那么运行包含.class文件的文件夹也需要在路径上(尽管我假设它已经在路径上,因为您能够运行程序并得到错误)。

于 2009-11-09T18:46:22.257 回答
1

考虑 File -> Export -> Runnable jar 创建一个可以直接调用的 jar 文件

java -jar yourProgram.jar

根据您的需要,有几种变体。

于 2009-11-09T19:23:45.223 回答
0

Eclipse 不会将类路径中的任何 jar 移动到项目的 bin 文件夹中。您需要将 util jar 复制到 bin 文件夹中。如果将其移动到 bin 文件夹的根目录,则可能无需任何类路径条目即可逃脱,但这不是推荐的解决方案。请参阅@BalusC 的答案以获得良好的报道。

于 2009-11-09T18:42:18.927 回答
0

默认情况下,Eclipse 不构建可执行的 java 类。不要问我为什么,但这可能与使用他们自己的 tools.jar(在 plugins/org.eclipse.core 中的某个地方?)有关,以便 Eclipse 可以在没有 JDK 的情况下运行。

您通常可以转到项目 bin 目录并执行以下操作:

java -cp . MyClass

但是,如果您有外部 jar,Eclipse 会以另一种奇怪的方式在内部处理它们,因此您也需要添加它们。

于 2011-02-10T01:50:50.970 回答
0

确保你的 jarcommons-lang-2.4.jar在类路径中而不是冗余。

我曾经将 jar 文件添加到我的类路径中,并在我的类路径中有 2 个文件 jar。我删除后,工作顺利

于 2014-03-11T10:34:11.180 回答