运行时嵌套类的java.lang.NoClassDefFoundError? (依赖性问题?)

时间:2012-07-01 13:08:42

标签: java jetty

好的,情况如下:

我有三个文件: 1. TScan.java 2. Test.java 3. ScanServlet.java

我在TScan.java文件中编写了我的邮件类TScan,在该类中,有一个嵌套类(不是子类),称为TEntry。 TScan有一个用于测试的main()和其他使用嵌套TEntry类的方法没有问题。

此外,Test.java是一个更高级的测试程序,它使用TScan.java中的项目,包括TScan和TEntry类,没有任何问题。 TScan.java和Test.java是在Eclipse中开发和测试的(它也可以从命令行编译/运行)。

所以TScan正在努力提供一个有用的点,我希望将它包含在一个webapp中。安装了Jetty并编写了在Jetty中运行的ScanServlet.java,没问题。

我开始引用TScan,它开始为TScan提供上述错误。更改ClassPath以包含TScan.class文件不起作用,因此我创建了一个JAR文件并将其粘贴到WebApp的WEB-INF / lib /文件夹中,现在ScanServlet编译filen,并且似乎在运行时找到了TScan -time,但它在运行时提供NoClassDefFounfError TScan $ TEntry。这对我来说没有意义,因为: 1.显然它现在正在寻找TScan类(因为它在编译或运行时没有抱怨) 2.错误发生在TScan.java文件中(TEntry不是直接引用,除了TScan),它在独立模式下运行良好! 3.我公开了TEntry,它仍然不起作用。

我发现了很多关于NoClassDefFoundError的问题,但是没有关于嵌套类的问题,尤其是Jetty。

请记住,我更习惯于Delphi,如果它编译,它会运行。 (和ABAP或多或少相同)。

如果有人有解决方案,我会很激动,否则,我正在考虑:

  • 复制 - 将整个TScan粘贴到ScanServlet中(如果它在同一个文件中,应该没有问题!)(不是很模块化)
  • 将TEntry移动到单独的.java文件中的单独类中? (可能很难干净地提取)。
  • 让ScanServlet将TScan.Java作为命令行程序调用。 (慢...)

2 个答案:

答案 0 :(得分:3)

你是如何创建jar文件并在正确的文件夹中包含TScan $ TEntry.class的? 内部或嵌套类仍然会生成一个需要发送的.class文件

答案 1 :(得分:0)

看起来你一直在跛行,因为你没有使用任何正式的构建工具,这些工具对你的开发应用了严谨和惯例。在搞乱什么是在哪里以及如何管理你的少数几个类之前......开始使用一个真正的构建系统来生成一个包含你需要的jar文件。 Maven,Ant,Buildr,等等......适用于某些约定或配置的东西。不要利用任何IDE在编译或导出应该可以运行的东西方面给你的任何东西......你不能相信任何那个铺位。

通过适当的构建机制和理想的声明性依赖关系等,您可以以迭代的方式解决问题以解决NCDFE问题。至少我2美分

[编辑] 在您的具体问题上,我怀疑您是否正在进入webapp类加载器配置。默认情况下,/ lib中的类不会暴露给webapp上下文。您需要将webapp上下文中的setParentLoaderPriority设置为true,或将您的类捆绑为war文件。还可以在cli上使用--dry-run来帮助理清jetty正在加载哪些jar文件。