1

当我在 Netbeans 中创建 Java Web 应用程序并尝试部署和运行它时,会引发以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/derby/iapi/services/property/PropertyUtil
    at org.apache.derby.impl.drda.NetworkServerControlImpl.getPropertyInfo(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.<init>(Unknown Source)
    at org.apache.derby.drda.NetworkServerControl.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.derby.iapi.services.property.PropertyUtil
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 3 more

清理和构建工作正常。早些时候,我曾经在我现在遇到问题的机器上成功部署和运行另一个 Java Web 应用程序。

我使用的是 Netbeans 7.1。我尝试升级到 Netbeans 7.3,但这并没有解决问题。我还尝试将 MySQL Connector/J JAR 文件放在/libGlassfish 的文件夹中,但这并没有解决问题。

4

2 回答 2

3

获得 Derby 类的 ClassNotFoundException 有两个基本原因:

  1. 您在 CLASSPATH 中缺少一个 Derby jar。例如,您可能已将 derbynet.jar 放在 CLASSPATH 中,但没有 derby.jar。
  2. 您的 CLASSPATH 中有多个 Derby jar 副本,并且版本不兼容。例如,您的类路径中可能有两个不同的 Derby.jar 类,而旧的与新的不兼容。

三件事可以使这更加复杂:

  1. Derby 的 jar 文件经常捆绑到其他包中。例如,我认为 Glassfish 本身捆绑了 Derby 的副本,因此与 Glassfish 捆绑的 Derby 版本与您与应用程序打包的版本之间可能存在冲突
  2. 对于现代版本的 Java,Java 虚拟机本身将在启动时“自动加载”Derby JDBC 驱动程序,这意味着有时 Derby 已在您打算加载之前就已加载,这会使您控制所使用的 Derby 版本的能力变得复杂使用。
  3. Java-EE 类路径规则很复杂,应用程序的运行类路径由每个应用程序的类路径位置、应用程序服务器提供的类路径位置和系统类路径位置构成。

Derby 'sysinfo' 工具旨在帮助诊断 CLASSPATH 问题,因此您可以尝试使用它来更全面地了解在您的类路径中找到了哪些 Derby jar 副本。

希望这可以帮助!

于 2013-03-24T17:09:26.117 回答
2

唯一的问题是在那台机器上,有人删除了 Java。:(

于 2013-03-27T13:54:45.240 回答