2

好的,情况如下:

我有三个文件: 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,写了ScanServlet.java,在Jetty中运行,没有问题。

我开始引用 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。(减缓...)
4

2 回答 2

3

您是如何创建 jar 文件的,它是否在正确的文件夹中包含 TScan$TEntry.class?
内部或嵌套类仍会生成您需要发布的 .class 文件

于 2012-07-01T13:27:43.857 回答
0

看起来您是一瘸一拐的,因为您没有使用任何正式的构建工具,这些工具将严格和惯例应用于您的开发。在弄乱什么在哪里以及如何管理你的少数类之前......开始使用一个真正的构建系统,它会生成一个包含你需要的 jar 文件。Maven、Ant、Buildr,等等……应用一些约定或配置的东西。不要利用任何 IDE 为您提供的任何东西来编译或导出应该可以运行的东西……你不能相信任何那个铺位。

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

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

于 2012-07-02T13:16:27.243 回答