【问题标题】:java.lang.NoClassDefFoundError. Class not found during runtime.java.lang.NoClassDefFoundError。运行时找不到类。
【发布时间】:2013-04-23 16:12:03
【问题描述】:

我正在开发 Eclipse,我需要使用外部库。例如 Jsoup 和 JXL。

现在我到目前为止所做的是:首先在我的项目文件夹中创建了一个“lib”文件夹。然后在eclipse中,单击项目属性,库选项卡,添加外部jar并将jar添加到lib文件夹中。

所以这解决了我的编译问题。现在,当我运行程序时(我转到 project/bin 并在控制台中执行: java ProgramName ;我得到 ​​p>

java.lang.NoClassDefFoundError: 

现在进行测试,我将 Jar 文件添加到 Main.java 所在的文件夹中,现在,我已经能够运行程序,执行以下操作:

javac -classpath ./path/to/jar Main.java
java -classpath ./path/to/jar:. Main  

这很有效。

所以首先想到的是我必须告诉 java 在哪里可以找到相应的库。如果这是正确的?我该怎么做?

java -cp ???(dont know what to put here)

但此外。我还有一个问题。我正在计算机上编写这个程序,但我将在其他可能没有这些库的地方使用它。我该如何解决这个问题?

【问题讨论】:

  • 您已经被问过类似的问题。您是否尝试将库放入应用服务器的类路径,正如我在这里提到的:stackoverflow.com/a/16149435/1430055
  • 如何调用其他计算机中不存在的其他库类的方法,而不将 jar 文件复制到其他计算机?

标签: java noclassdeffounderror


【解决方案1】:

我喜欢使用类似以下的东西:

java -cp myjar.jar;lib/*.jar com.foo.bar.MyClass

这不仅将我的 jar 添加到类路径中,还添加了 lib 目录中的 jar。

如果您想在另一台计算机上运行您的 jar,您也需要这些 jar,您不能只拥有您的 jar。为什么不直接打包你的 lib 目录呢?

【讨论】:

  • 这可能很愚蠢,但我在使用 -cp 命令时遇到了问题。我用了你的命令。但这给了我一个错误。它说权限被拒绝
【解决方案2】:

要让您的程序运行,您需要担心两条路径

  1. jar 文件的路径,这些文件是您的应用程序依赖项(如 jsoup.jar)(我们称之为 lib)
  2. 包含应用程序类的目录的路径(我们称之为类)

你需要的命令行的一般形式是:

java -cp lib/jsoup.jar:classes Main

如果你有更多的库

java -cp lib/jsoup.jar:lib/jxl.jar:classes Main

关于打包您的应用以发布到其他计算机的一般说明。您可能想考虑制作一个您自己的应用程序的 jar,最好使用 http://ant.apache.org/manual/Tasks/jar.html

另一种选择是制作一个“一个罐子”,它会制作一个大罐子,将您需要的库中的所有类和应用程序中的所有类捆绑在一起。然后,您可以使 jar 可执行,以获得良好的开箱即用解决方案。看看http://one-jar.sourceforge.net/https://code.google.com/p/jarjar/

【讨论】:

  • 我需要做的第一件事就是能够运行它。我在使用 java -cp 时遇到问题
  • 我正在使用:java -cp ../lib/jxl-2.6.jar:classes Main 但它显示错误:无法找到或加载主类 Main
  • Main.class 在什么目录下?
  • 如果我们在项目文件夹的根目录下,我们有 /bin /lib /src 并且 Main.class 在 /bin 中。我在 /bin 里面执行这个命令
  • 好的。 “类”是 Main 所在的目录。所以你需要java -cp ../lib/jxl-2.6.jar:。如果您从 bin 运行,则为 Main。如果您在根目录中,则 java -cp lib/jxl-2.6.jar:bin Main
【解决方案3】:

如果你有这个结构:

project folder
... code
... libs

然后从代码文件夹中:

javac -cp .;../libs/*.jar yourmainclass.java
java -cp  .;../libs/*.jar yourmainclass

当你需要编译和运行这个项目时,把所有的文件夹拿下来,在其他机器上做同样的事情。

【讨论】:

  • 好的,我在代码文件夹中,并执行了您编写的内容,但出现错误。很奇怪。想在这里发布吗?
  • 这是我得到的:alessandro@ALC:~/Java/Trabajo/src$ javac -cp .;../lib/*.jar Main.java javac:没有源文件用法:javac 使用 -help 获取可能的选项列表 bash: ../lib/jxl-2.6.jar: Permission denied
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2016-01-23
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多